Description
Suppose an array sorted in ascending order 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.
Solution
时间复杂度要log(N)的话,就要用二分法搜索。
二分法搜索一个普通有序数组的时候,通过比较中间值和target,来判断target在中间值左边还是右边。
循环的有序数组(这里是升序),可以拆成两个有序部分,可以通过比较left和mid来确定分界点在左侧还是右侧。
(1)如果target==mid,那么就找到了这个数。
(2)如果left<mid,说明mid的左半部分一定是有序的。然后可以判断target是否在左半部分的范围中。
(3)如果left>mid,说明mid的右半部分一定是有序的。然后可以判断target是否在右半部分的范围中。
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(target==nums[mid])
return mid;
if(nums[left]>nums[mid])//转折点在左,右半部分一定有序
{
if(target>nums[mid]&&target<=nums[right])//判断target是否在右半边
{
left=mid+1;
}
else
right=mid-1;
}
else//转折点在右,左半部分一定有序
{
if(target>=nums[left]&&target<nums[mid])//判断target是否在左半边
{
right=mid-1;
}
else
left=mid+1;
}
}
return -1;
}
};