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.
class Solution {
public:
int search(int A[], int n, int target) {
return bs(A,0,n-1,target);
}
int bs(int A[],int left,int right,int target){
if(left<right){
//没有rotated,数组递增
if(A[left]<A[right]){
if(target<A[left]||target>A[right]){
return -1;
}else{
int center=(left+right)/2;
if(A[center]==target)
return center;
else if(A[center]<target){
return bs(A,center+1,right,target);
}else{
return bs(A,left,center,target);
}
}
}else{
int center = (left+right)/2;
if(A[center]==target)
return center;
int index = bs(A,left,center,target);
if(-1==index)
return bs(A,center+1,right,target);
return index;
}
}else if(left==right){
if(A[left]==target)
return left;
return -1;
}
}
};
算法2:
稍微繁琐的条件判断:
如果数组递增,也就是说没有rotated,则A[center]>A[left];
class Solution {
public:
int search(int A[], int n, int target) {
int l=0;
int r=n-1;
while(l<=r){
int center=(l+r)/2;
if(A[center]==target){
return center;
}else if(A[center]>target){
if(A[center]>=A[l]){
if(A[l]<=target){
r=center-1;
}else{
l=center+1;
}
}else{
r=center-1;
}
}else{
if(A[center]<=A[r]){
if(target<=A[r]){
l=center+1;
}else{
r=center-1;
}
}else{
l=center+1;
}
}
}
return -1;
}
};