二分查找变形。比较时判断target是处于是否处于有序的那一段,判断是否处于有序的方法是:比较A[mid]和A[low]或者A[high]的大小。
如果有重复的元素,那么还要在比较前对数组进行处理,如果A[mid]==A[low]则low++,直到不等。
Search in Rotated Sorted Array I:
class Solution {
public:
int search(int A[], int n, int target) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int low = 0, high = n-1;
int mid;
while(low <= high){
mid = (low+high)/2;
if(A[mid] == target)
return mid;
else if(A[low] > A[mid]){
if(target > A[mid] && target < A[low])
low = mid+1;
else high = mid-1;
}
else if(A[mid] > A[high]){
if(target > A[high] && target < A[mid])
high = mid-1;
else low = mid+1;
}
else{
if(A[mid] > target){
high = mid-1;
}
else if(A[mid] < target){
low = mid+1;
}
//else return mid;
}
}
return -1;
}
};
Search in Rotated Sorted Array II:
class Solution {
public:
bool search(int A[], int n, int target) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int low = 0, high = n-1;
int mid;
while(low <= high){
mid = (low+high)/2;
if(A[mid] == target)
return true;
else if(A[mid] == A[low]){
low++;
}
else if(A[low] > A[mid]){
if(target > A[mid] && target < A[low])
low = mid+1;
else high = mid-1;
}
else if(A[mid] > A[high]){
if(target > A[high] && target < A[mid])
high = mid-1;
else low = mid+1;
}
else{
if(A[mid] > target){
high = mid-1;
}
else if(A[mid] < target){
low = mid+1;
}
//else return mid;
}
}
return false;
}
};