题目
先要判断哪一块是绝对单调的,然后分情况讨论
因为这里存在着重复值,所以会存在特殊的case,[1,1,3,1],3。中间值与两边的值相等,这样就没法判断哪块是绝对单调的了。所以要遇见相同值的时候,r–
class Solution {
public boolean search(int[] nums, int target) {
int l=0,r=nums.length-1;
while(l<=r){
int mid = (l+r)/2;
if(nums[mid]==target) return true;
if(nums[mid]>nums[r]){
if(nums[mid]<target){
l=mid+1;
}else{
if(nums[l]<=target){
r = mid-1;
}else{
l = mid+1;
}
}
}else if(nums[mid] <nums[r]){
if(target>nums[r]){
r = mid-1;
}else{
if(mid+1<nums.length && target<nums[mid+1]){
r = mid-1;
}else{
l = mid+1;
}
}
}else{
r--;
}
}
return false;
}
}
思路又捋了捋
class Solution {
public boolean search(int[] nums, int target) {
int l=0,r=nums.length-1;
while(l<=r){
int mid = (l+r)/2;
if(nums[mid]==target) return true;
if(nums[mid]>nums[r]){
if(nums[l]<=target && nums[mid]>target) r=mid-1;
else l=mid+1;
}else if(nums[mid] <nums[r]){
if(nums[r]>=target && nums[mid]<target) l=mid+1;
else r=mid-1;
}else{
r--;
}
}
return false;
}
}