两种方法
1、首先找到两个数组的分界,然后在两个数组上分别应用二分查找
int bsearch(int A[], int start, int end, int target){
while(start <= end){
int mid = (start + end) >> 1;
if(target == A[mid]) return mid;
else if(target > A[mid]){ start = mid + 1; }
else{ end = mid - 1; }
}
return -1;
}
//Runtime: 7ms
int search(int A[], int n, int target) {
int preMax = 0;
int aftMin = 0;
for(int i = 1; i < n; ++i){
if(A[i] < A[i - 1]){
preMax = i - 1;
aftMin = i;
break;
}
}
int idx = -1;
if(target >= A[0] && target <= A[preMax]){
idx = bsearch(A, 0, preMax, target);
}else{
idx = bsearch(A, aftMin, n - 1, target);
}
return idx;
}
2、直接在原数组上应用二分查找
int search(int A[], int n, int target){
int start = 0;
int end = n - 1;
while(start <= end){
int mid = (start + end) >> 1;
if(target == A[mid]) return mid;
else{
if(A[start] <= A[mid]){
if(target > A[mid]) start = mid + 1;
else if(target >= A[start]) end = mid - 1;
else start = mid + 1;
}else{
if(target < A[mid]) end = mid - 1;
else if(target <= A[end]) start = mid + 1;
else end = mid - 1;
}
}
}
return -1;
}