题目
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
算法
二分搜索的变形
1. 通过中间元素和左右元素判断,判断 那一个部分有血
2. 如果左半部分有序,目标值落在有序区间,移动右指针,因为无序部分要么比中间大,要么小;如果目标值不在有序区间,则移动左指针
3. 右半部分有序,目标值落在有序区间里,那么移动做指针,抛弃左指针;如果目标值不在有序区间,抛弃右半部分,移动有指针
复杂度
o(lgn)
class Solution{
public:
int search(vector<int> &nums,int target){
int left=0,right=nums.size();
while(left!=right){
int mid = left+(right-left)/2;
if(nums[mid]==target)
return mid;
if(nums[mid]>=nums[left]){
//[left~right] is unrotated sorted
if(nums[left]<=target && target <nums[mid])
right=mid;
else
left=mid+1;
}else{
if(nums[mid]<target && target <=nums[right-1])
left=mid+1;
else
right=mid;
}
}
return -1;
}
};