在不含重复元素的基础上,可能出现中间元素与右边元素相同的情况.
因为判断了与中间元素不相等,所以当中间元素与最右元素相等时(此时左半部分也不一定是全部相同的,如[3 1 1]),最右元素可以直接跳过不用判断,right–.重新计算mid与最右判断,若有,则可以判断这一段(存在比中间元素大[1 1 1 2 3 1])或者是左半段(存在比中间元素小,如[3 3 3 1 2 3])是排序的,按照原二分查找执行.若无,直接找到不存在(说明整个数组都是相同的,跳出条件left>right)
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1,mid=0;
while(left<=right){
mid=(left+right)/2;
if(nums[mid]==target) return true;
else if(nums[mid]<nums[right]){
if(target>nums[mid]&&target<=nums[right]) left=mid+1;
else right=mid-1;
}
else if(nums[mid]>nums[right]){
if(target<nums[mid]&&target>=nums[left]) right=mid-1;
else left=mid+1;
}
else right--;
}
return false;
}
};