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;
}
};