二分
要注意的是,由于存在重复数字,所以初始状态可能不满足二分的性质。不满足的情况是:左边开始的数字和右边结束的数字相等,所以一开始要缩小右边界,让右边界的数字小于第一个数字。这样左边的数字都大于等于第一个数字,右边的数字都小于第一个数字,两个区间的性质不同,就可以进行二分了。还有排除递增的情况。
class Solution {
public int minArray(int[] numbers) {
int l = 0, r = numbers.length - 1;
while(r > 0 && numbers[r] == numbers[0]) r--; // 缩小右边界
if(numbers[r] >= numbers[0]) return numbers[0]; // 排除递增的情况
while(l < r){
int mid = (l + r) >> 1;
if(numbers[mid] >= numbers[0]) l = mid + 1;
else r = mid;
}
return numbers[l];
}
}