难度:2
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.
嗯。。拆分两段后,容易发现第一段的最后一个数大于第二段的最后一个数,并且第二段的第一个数小于第二段的最后一个数
比如
4 5 6 7 0 1 2
2一定小于7并且大于0
任何题意给定的序列都满足这个关系
所以先二分找到两段的交点
然后分别二分找到答案
class Solution
{
public:
int search_2(int A[], int L, int R, int target)
{
while(L<=R)
{
int mid=(L+R)>>1;
if(A[mid]>target)
{
R=mid-1;
}
else if(A[mid]<target)
{
L=mid+1;
}
else return mid;
}
return -1;
}
int search(int A[], int n, int target)
{
if(n == 0) return -1;
if(n == 1)
{
if(A[0] == target) return 0;
else return -1;
}
if(n == 2)
{
if(A[0] == target) return 0;
else if(A[1] == target) return 1;
else return -1;
}
int L=0,R=n-2;
while(L<R)//[0,n-2]找一个比A[n-1]大的数
{
int mid=(L+R>>1)+1;
if(A[mid]>A[n-1]) L=mid;
else R=mid-1;
}
int split=L;
if(A[L]<A[n-1]) split=n-1;
//[0,split],[split+1,n-1]
int ans;
ans=search_2(A,0,split,target);
if(ans!=-1) return ans;
if(split+1<=n-1)
{
return search_2(A,split+1,n-1,target);
}
return -1;
}
};