Leetcode--Search in Rotated Sorted Array

来源:互联网 发布:阿里的大数据应用 编辑:程序博客网 时间:2024/06/08 01:49

题目链接: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;    }



阅读全文
0 0
原创粉丝点击