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.
解法:
不含重复元素的排序数组,升序,旋转后,其为两个排序数组,A,B;B可能为空,如果为空,则整个数组为升序,A中的所有元素,比B中的要大。
注意A的末尾是转折点
left=0,right=size-1;mid=left+(right-left)/2 这里最好这样写,right+left 可能溢出
nums[mid]==target return mid
nums[left]<=nums[mid] 这里存在等于号是因为left和mid 可能是同一个下标,这种情况,转折点在mid右边,可能包含mid
a)如果nums[left]<=target&&target<nums[mid] 则right=mid-1 ,这种情况,说明target在A中,
b)不满足a,则说明target在mid的右边,left=mid+1
nums[left]>nums[mid] 这种情况下,转折点在mid的左边,
a)如果nums[mid]<target&&nums[right]>=target 则left=mid+1;这种情况,说明target在B中或者,B为空,A为升序,(mid,right]里,
b)不满足a,则说明target在mid的左边,自然right=mid-1
int search(vector<int>& nums, int target) {
int size=nums.size();
if(size==0)
return -1;
int left=0,right=size-1;
while(left<=right){
int mid=left+(right-left)/2;//right+left may be overflow;
if(nums[mid]==target)
return mid;
if(nums[left]<=nums[mid]){//这里包含等于,因为left和mid可能指向同一个元素,
if(nums[left]<=target&&target<nums[mid]){
right=mid-1;
}
else
left=mid+1;
}
else{
if(nums[mid]<target&&target<=nums[right])
left=mid+1;
else
right=mid-1;
}
}
return -1;
}
Search in Rotated Sorted Array
原文:http://searchcoding.blog.51cto.com/1335412/1694218