分析
对于数组中有重复元素的情况,二分查找时可能会有 a[l]=a[mid]=a[r],a[l]=a[mid]=a[r],此时无法判断区间 [l,mid] 和区间 [mid+1,r] 哪个是有序的。
例如 nums=[3,1,2,3,3,3,3],target=2,首次二分时无法判断区间 [0,3][0,3] 和区间 [4,6][4,6] 哪个是有序的。
对于这种情况,我们只能将当前二分区间的左边界加一,右边界减一,然后在新区间上继续二分查找
class Solution {
public:
bool search(vector<int>& nums, int target) {
int n=nums.size();
if(n==0)return false;
if(n==1)return nums[0]==target;
int l=0,r=n-1;
while(l<=r){
int mid=(l+r)>>1;
if(nums[mid]==target)return true;
if(nums[l]==nums[mid]&&nums[mid]==nums[r]){
++l;--r;
}else if(nums[l]<=nums[mid]){
if(nums[l]<=target&&target<nums[mid]){
r=mid-1;
}else{
l=mid+1;
}
}else{
if(nums[mid]<target&&target<=nums[n-1]){
l=mid+1;
}else{
r=mid-1;
}
}
}
return false;
}
};