看了官方题解很简洁,解释如下
//结果是后半段的第一个元素
class Solution {
public int findMin(int[] nums) {
int len=nums.length;
if(len==1) return nums[0];
int left=0,right=len-1;
while(left<right){//没有等号,区间为1时返回结果
int mid=(left+right)/2;
if(nums[mid]<nums[right]){//mid在后半段
right=mid;//mid以后的都不要了,mid本身是要的,他可能是结果
}
else{//mid在前半段
left=mid+1;
}
}
return nums[left];
}
}
我写的太复杂了,不推荐
//最小元素就是分界点
class Solution {
public int findMin(int[] nums) {
int len=nums.length;
if(len==1) return nums[0];
int left=0,right=len-1;
int f1=0,f2=len-1;//记录给出的左右边界
while(left<=right){
int mid=(left+right)/2;
int before=mid-1>=0?nums[mid-1]:-5001;
if(before>nums[mid]){//前一个更大,说明是分界点
return nums[mid];
}
if(mid==0&&nums[mid]<=nums[f2]){//本身就是正序,第一个元素就是最小的
return nums[mid];
}
if(nums[mid]<=nums[f2]){//mid在后半段
right=mid-1;
}
else{//mid在前半段
left=mid+1;
}
}
return -1;//没找到,不可能
}
}