lc 153 寻找旋转排序数组的最小值
核心:去掉单调的部分剩下的就是不连续点
只比较mid和right的
分为两种情况,最小值在左边和最小值在右边
二分的目的,是将目标最小值套住,通过判断mid与左右的大小关系,通过判断mid与左右的大小关系,将单调递增的那部分去除掉,最后剩下的就是不连续的点。这个点可能在单调部分的最左边,但绝对不能能在右边
nums[mid] < nums[right] 时候说明右边是递增的,最小值在左边,有可能是mid,所以去掉右边,right = mid
nums[mid] > nums[right]时候说明左边是递增的,最小值在右边,不可能是mid,所以去掉左边
left = mid + 1
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
//左开右开保证里面始终能套住最小值
//left == right时,只剩一个数,退出循环
while(left < right){
//向下去整,mid更靠近left,所以left <= mid, mid < right
//所以循环里mid始终小于right,所以nums[mid] 和 nums[right] 永远不会相等
//
int mid = left + (right - left) / 2;
if(nums[mid] > nums[right]){
left = mid + 1;
}else{
right = mid;
}
}
//循环到最后剩两个数,无论他俩谁大谁小
//最终left 、 right 、mid是相等的,输出谁都行,都保存了最小值
return nums[left];
}
}