33. Search in Rotated Sorted Array

题意

给一个有序数组,在一个特定的未知位置旋转一次。要求在logn的时间内找到target。

思路

先找到在哪里进行旋转,然后根据范围在左半部分或者右半部分二分查找。

代码

class Solution {
public:
    int jtfind(vector<int>& nums, int t, int left, int right)
    {
        if (right < left) return -1;
        while (left <= right)
        {
            int mid = (left+right)>>1;
            if (nums[mid] > t)
                right = mid-1;
            else if (nums[mid] == t)
                return mid;
            else
                left = mid+1;
        }
        return -1;
    }
    int search(vector<int>& nums, int target) {
        if (!nums.size()) return -1;
        int base = nums[0];
        int l = 0, r = nums.size()-1;
        while (l <= r)
        {
            int mid = (l+r)>>1;
            if (nums[mid] < base) r = mid-1;
            else l = mid+1;
        }
        //nums[r]为整个数列的最大值,nums[l]为最小值
        int res;
        if (target >= nums[0])
            res = jtfind(nums, target, 0, r);
        else
            res = jtfind(nums, target, l, nums.size()-1);
        return res;
    }
};

33. Search in Rotated Sorted Array