题目描述:
解决:
class Solution {
public boolean search(int[] nums, int target) {
int len= nums.length;
if(len==1){
if(target==nums[0]){
return true;
}return false;
}else {
int left=0;
int right=len-1;
while (left<=right){
int mid=(left+right)/2;
if(target==nums[mid]){
return true;
}
if(nums[left]==nums[mid]&&nums[mid]==nums[right]){
left++;
right--;
} else if(nums[left]<=nums[mid]){
if(nums[left]<=target&&target<nums[mid]){
right=mid-1;
}else {
left=mid+1;
}
}else {
if(nums[mid]<target&&target<=nums[right]){
left=mid+1;
}else {
right=mid-1;
}
}
}
}
return false;
}
}
我们在LeCo-33.中知道我们可以考虑局部有序,但是这道题,有重复元素,只保证不递减,可能会出现上图所示的情况。也就是说left=mid=right。怎么办?直觉反应,我们考虑left mid-1 mid+1 right 是否相等?
那这种情况呢?我们是不是陷入无止境了?
回想我们的目的,我们要找到mid左右两端非降序的某部分,然后对该部分进行二分,由于left =mid =right阻碍了我们处理,那么我直接left++,right- -规避掉这种情况不就行了?实在是高啊!!!!