Follow up for “Search in Rotated Sorted Array”:
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
//This question is the advanced version of question "Search in Rotated Sorted Array I"
//The key to solve it is to determine when to use linear search algorithm rather than an binary search one.
//When A[start] == A[end - 1], we have to search all the cases between [start, mid), and [mid, end)
//because we don't know where the pivot is. We can't shrink the search range unless A[mid] != A[start] and A[mid] != A[end - 1], which is a small possible incident.
class Solution {
public:
bool search(vector A,int target) {
int n = A.size();
if(n == 0){
return false;
}
return _search(A, 0, n, target);
}
bool _search(vector A, int start, int end, int target){
//base case
if(end - start == 1){
return A[start] == target;
}
int mid = (start + end) / 2;
if(A[start] == A[end - 1]){
//linear search
return _search(A, start, mid, target) || _search(A, mid, end, target);
}
else{
//binary search
if(A[start] < A[end - 1]){
if(target < A[mid]){ return _search(A, start, mid, target); } else{ return _search(A, mid, end, target); } } //pivot is between start and end - 1 else{ if(A[mid] >= A[start]){
if(target >= A[mid]){
return _search(A, mid, end, target);
}
else{
if(target <= A[end - 1]){ return _search(A, mid, end, target); } else{ return _search(A, start, mid, target); } } } //mid is at the right of pivot else{ if(target >= A[start]){
return _search(A, start, mid ,target);
}
else{
if(target < A[mid]){
return _search(A, start, mid, target);
}
else{
return _search(A, mid, end, target);
}
}
}
}
}
}
};
