33 Search in Rotated Sorted Array

来源:互联网 发布:淘宝网毛呢长裙 编辑:程序博客网 时间:2024/05/24 03:22
这道题乍一看我就下意识用了暴力法,然后竟然还通过了。。。
class Solution {public:    int search(vector<int>& nums, int target) {        for(int i =0; i <nums.size();i++)        {            if(nums[i]==target)            return i;        }        return -1;    }};

然后感觉不能这样,应该是需要用二分查找等来使复杂度降低为logN好一些,各种判定条件有点想不周到,所以就去参考他们的回答顺便给翻译一下。

class Solution {public:    int search(vector<int>& nums, int target) {        if(nums.size() == 0)            return -1;        int left = 0;        int right = nums.size()-1;        while(left <= right){            int mid = (left+right)/2;            if(target == nums[mid])                return mid;            if((nums[mid]>=nums[left] && (target>nums[mid] || (target<nums[left]))) || (nums[mid]<nums[left] && target>nums[mid] && target<=nums[right]))                left = mid + 1;            else                right = mid -1;        }        return -1;    }};
也是正常二分查找的初始规则,然是不同点是MID的位置,MID有可能会大于left也可能会小于left比如1234567,可能反转为4567123也可能反转为5671234。这就需要分情况讨论一下了,如果mid>=left,证明mid后面的数可能有比mid大的,而且left到mid是递增的。所以如果target>mid下一次查找一定会搜寻右半边,也可能target比left还小,这样也一定答案在右半边。    如果mid<left,那么mid到right是递增的,而且right<=left。这样当target如果大于mid而且小于right一定会搜寻右半边,如果target大于left就一定搜寻左半边了。


0 0