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.
int binaryfind(int* A, int first,int last, int target){
while (first<=last){
int mid = (first + last) / 2;
if (A[mid] == target)
return mid;
else if (A[mid] < target)
first = mid + 1;
else
last = mid - 1;
}
return -1;
}
int search(int A[], int n, int target) {
int first = 0;
int last = n - 1;
if (A[first] <= A[last])
return binaryfind(A, first, last, target);
int idx = -1;
while (first<=last){
int mid = (first + last) / 2;
if (A[first] <= A[mid]){
if (target <= A[mid]){ //注意等号的限定条件
idx = binaryfind(A, first, mid, target);
if (idx!=-1)
break;
}
first = mid + 1;
}
else{
if (target >= A[mid]){
idx = binaryfind(A, mid, last, target);
if (idx != -1)
break;
}
last = mid - 1;
}
}
return idx;
}