思路:重复的元素需要多分一些情况,需要将 left, mid, right三个元素综合比较,注意啊,如果这三个位置的元素相等,则需要一步转化成顺序搜索,不过后面又可以回到二分搜索中来,具体细节见代码。
code:
class Solution {
public:
bool search(int A[], int n, int target) {
int l = 0, r = n-1,mid;
while(l <= r){
mid = (l + r) / 2;
if(A[mid] == target)
return true;
else if(A[l] < A[mid]){
if(target < A[mid]){
if(target >= A[l])// 目标值在前一个子数组中
r = mid - 1;
else //目标值在后一个子数组
l = mid + 1;
}
else
l = mid + 1;
}
else if(A[l] > A[mid]){
if(target > A[mid] && target <= A[r])
l = mid + 1;
else
r = mid - 1;
}
else{
l++; //left,mid, right 三个位置的元素相等,这一步转化成顺序搜索
}
}
return false;
}
};