1、前言
题目描述2、思路
这道题如果按照 [3,4,5,1,2] 那种,其实还算好做。但是偏偏有 [10, 1, 2, 10, 10] 那种,所以只能确定的是,只能使用 right 而非 left 作为 target。
- 如果 numbers[mid] > numbers[right],则 mid 以及 mid 的左边一定不是最小数字
- 如果 numbers[mid] == numbers[right],只能把 right 排除掉,下一轮搜索区间是 [left, right - 1]
- 如果 numbers[mid] < numbers[right],mid 的右边一定不是最小数字,mid 有可能是,下一轮搜索区间是 [left, mid]
3、代码
public int minArray(int[] numbers) {
int left = 0, right = numbers.length - 1;
while(left < right){
int mid = (left + right) / 2;
if(numbers[mid] > numbers[right]){
left = mid + 1;
}else if(numbers[mid] == numbers[right]){
right = right - 1;
}else{
right = mid;
}
}
return numbers[left];
}
网友评论