class Solution {
public int findMin(int[] nums) {
if (nums.length == 0) {
return 0;
}
//最小的数是第一个小于右边界的数
int left = 0;
int right = nums.length - 1;
int rightNum = nums[right];
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > rightNum) {
left = mid;
} else {
right = mid;
}
}
return Math.min(nums[left], nums[right]);
}
}
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left + 1 < right) {
//右边界定义在循环内,因为可能会收缩右边界
int rightNum = nums[right];
int mid = left + (right - left) / 2;
if (nums[mid] > rightNum) {
left = mid;
}
//这一步是不同,如果出现和右边界相等的值,那么需要收缩右边界。
//因为这个值和右边界的值相等,所以去掉右边界不会去掉最小值
elseif (nums[mid] == rightNum) {
right--;
} else {
right = mid;
}
}
return Math.min(nums[left], nums[right]);
}
}