Leetcode--Search in Rotated Sorted Array

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array/description/

题目的意思是本来一个数组是升序排列的,现在可能以某一个数为结点进行了翻转,也有可能没有。题目是二分查找的变体,但因为有rotate的存在,当切取一半的时候可能会出现误区,需要我们自行判断,数组nums[],左边缘为l,右边缘为r,还有中间点为m,在每次迭代中,分三种情况讨论。

(1)如果target==nums[m],那么m就是我们要的结果,直接返回;

(2)如果nums[m]<nums[r],那么说明从m到r一定是有序的(没有受到rotate的影响),那么我们只需要判断target是不是在m到r之间,如果是则把左边缘移到m+1,否则就target在另一半,即把右边缘移到m-1。

(3)如果nums[m]>=nums[r],那么说明从l到m一定是有序的,同样只需要判断target是否在这个范围内,相应的移动边缘即可。

根据以上方法,每次我们都可以切掉一半的数据,所以算法的时间复杂度是O(logn),空间复杂度是O(1)。代码如下:

 int search(vector<int>& nums, int target) {
        if(nums.empty()) return -1;
        int l=0,r=nums.size()-1;
        while(l<=r){
            int m=(l+r)/2;
        if(target==nums[m]) return m;
            
        if(nums[m]<nums[r])
        {
            if(target>nums[m]&&target<=nums[r])
                l=m+1;
            else
                r=m-1;
                
            
        }
        else
        {
            if(target>=nums[l]&&target<nums[m])
                r=m-1;
            else
                l=m+1;
        }
        }
       
        return -1;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值