题目:
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.
思路:此题比较复杂,有三种情况需要判断:1. 左区间是正常的。 2. 右区间正常。 3. 左边和中间相等, 则说明左边到中间都是相同数字,此时需要判断时候和右边相等,如果不相等则搜索右边,如果相等则需要搜索两边。
代码:
class Solution {
public:
bool search(int A[], int n, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int left = 0;
int right = n-1;
while (left<=right){
int mid = (left+right)/2;
if (A[mid] == target) return true;
if (A[left]<A[mid]){//left is normally ordered
if (A[left]<=target && target<=A[mid]) right = mid-1;
else left = mid+1;
}
else if (A[mid]<A[left]){//right is normally ordered
if (A[mid]<=target && target<=A[right]) left = mid+1;
else right = mid -1;
}
else if (A[left] == A[mid]){//left half is all repeats
if (A[mid] != A[right]) //If right is diff search it
left = mid+1;
else{//Else, we have to search both halves
int result = search(A+left, mid-left, target);//search left
if (result == false)
return search(A+mid, right-mid, target);//search right
else return result;
}
}
}
return false;
}
};
浙公网安备 33010602011771号