leetcode 33 Search in Rotated Sorted Array

题意:给一个旋转过的升序序列,比如[0, 1, 2, 3, 4]可以旋转为[2, 3, 4, 0, 1],然后给一个目标数,求他在不在这个序列中。

 

解法:如果不旋转的话就是个普通的二分查找,但是旋转之后需要算index什么的好麻烦……旋转的偏移量也可用二分求,所以就是两次二分……对于我这个二分苦手来说就当练练二分了……

看了discuss有人说线性查找就过了……吐血……数据真弱……

 

代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int ri = 0; //旋转的偏移量
        int len = nums.size();
        int l = 0, r = len - 1, mid;
        if(nums[0] > nums[len - 1]) {
            while(l <= r) {
                if(l == r) {
                    ri = l;
                    break;
                }
                mid = (l + r) >> 1;
                if(nums[mid + 1] > nums[r]) l = mid + 1;
                else if(nums[l] > nums[mid]) r = mid;
                else {
                    ri = mid + 1;
                    break;
                }
            }
        }
        l = 0, r = len - 1, mid;
        l = (l + ri) % len;
        r = (r + ri) % len;
        mid = (l + (r + len - l) % len / 2) % len;
        int cnt = 0;
        while(cnt < 100) { //这里的条件算起来好麻烦……所以就写了个计数器……反正不会超过log(INT_MAX)的……
            if(nums[mid] == target) return mid;
            else if(nums[mid] > target) r = (mid + len - 1) % len;
            else if(nums[mid] < target) l = (mid + 1) % len;
            mid = (l + (r + len - l) % len / 2) % len;
            cnt++;
        }
        return -1;
    }
};

  

你可能感兴趣的:(leetcode 33 Search in Rotated Sorted Array)