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.
思路总结:
1、总体思想是用二分查找
2、二分后会将原数组划分为2个子数组,根据mid的落点划分为:一个子数组完全递增,另一个子数组形式同原数组
3、再针对target的落点,可以分为两种情况,一种是target落在完全递增的子数组中,此种情况采用正常二分法即可求解;另一种情况是target落在形式同原数组的子数组中,此种情况即该题的一个子问题,即重复执行2、3步即可。
class Solution {
public:
int search(int A[], int n, int target) {
int low = 0;
int high = n-1;
while(low <= high){
int mid = (low + high)/2;
if(A[mid] == target) return mid; //找到target
if(A[low] <= A[mid]){ //根据mid -> 完全递增子数组
if(A[low] <= target && target < A[mid]){ //根据target落点,在完全递增子数组中
high = mid;
}else{//根据target落点,在形式同原数组的子数组中
low = mid + 1;
}
}else{ //根据mid -> 形式同原数组的子数组
if(A[mid] < target && target <= A[high]){//根据target落点,在完全递增子数组中
low = mid +1;
}else{// 根据target落点,在形式同原数组的子数组中
high = mid;
}
}
}
return -1;
}
};