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 {
/**
* param A : an integer ratated sorted array
* param target : an integer to be searched
* return : an integer
*/
public:
int searchPartition(vector<int> &A, int target, int left, int right){
int l = left, r = right;
if(l > r) return -1;
while(l < r){
int mid = (l + r) / 2;
if(A[mid] == target) return mid;
else if(A[mid] < target) l = mid + 1;
else r = mid - 1;
}
if(A[l] == target) return l;
else return -1;
}
int search(vector<int> &A, int target) {
// write your code here
int n = A.size();
if(n == 0) return -1;
int left = 0, right = n - 1;
int minIndex;
while(left + 1 < right && A[left] > A[right]){
int mid = (left + right) / 2;
if(A[mid] < A[right]) right = mid;
else if(A[mid] > A[left]) left = mid;
}
minIndex = A[left] < A[right] ? left : right;
int findLeft = searchPartition(A, target, 0, minIndex - 1);
int findRight = searchPartition(A, target, minIndex, n - 1);
if(findLeft == -1){
if(findRight == -1) return -1;
else return findRight;
}
else return findLeft;
}
};
方法二:
同时考虑
//方法二:一起考虑
class Solution {
/**
* param A : an integer ratated sorted array
* param target : an integer to be searched
* return : an integer
*/
public:
int search(vector<int> &A, int target) {
// write your code here
int n = A.size();
if(n == 0) return -1;
int left = 0, right = n - 1;
while(left < right){
int mid = (left + right) / 2;
if(A[mid] == target) return mid;
if(A[mid] > A[left]){
if(target < A[mid] && target >= A[left]) //注意要>=
right = mid - 1;
else left = mid + 1; //即target<A[mid]也<A[left]和target>A[mid]
}
else{
if(target > A[mid] && target <= A[right])
left = mid + 1;
else right = mid - 1;
}
}
if(A[left] == target) return left;
else return -1;
}
};