两种写法,还是有一些细节不一样的。
// LC 78 搜索旋转数组Ⅱ medium 2025年3月18日
// 第一种写法 找右半段区间的最小值
public boolean search(int[] nums, int target) {
int n = nums.length;
if(n==0) return false;
if(n==1) return nums[0] == target;
int R = n-1;
while(R>0 && nums[R] == nums[0]) R--;
n = R;
int l = 0, r = n;
// 寻找右半段区间的最小值
while(l<r){
int mid = l+r>>1;
if(nums[mid]<=nums[R]) r=mid;
else l=mid+1;
}
if(target<= nums[R]){
r=R;
}else{
l = 0; r -- ;
}
while(l<r){
int mid = l+r>>1;
if(nums[mid]>= target) r= mid;
else l = mid+1;
}
return nums[l] == target;
}
// 第二种写法 找左半段区间的最大值
public boolean search(int[] nums, int target) {
int n = nums.length;
if(n==0) return false;
if(n==1) return nums[0] == target;
int R = nums.length-1;
while(R>0 && nums[R] == nums[0]) R--;
int l = 0, r = R;
// 寻找左半段区间的最大值
while(l<r){
int mid = l+r+1>>1;
if(nums[mid]>= nums[0]) l=mid;
else r = mid-1;
}
if(target>= nums[0]){
l=0;
}else{//输入是[1,3] t=0时。l会被赋值成2,超出范围。所以最后一行只能取nums[r]
l++;
r=R;
}
while(l<r){
int mid = l+r>>1;
if(nums[mid]>= target) r = mid;
else l = mid+1;
}
return nums[r] == target;// 这里只能写r了
}