leetcode 链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
题目
解法
二分查找只能用在递增序列中,但是本题可以利用二分查找来缩减区间,不过需要注意比较对象。中点的值与左端点的值进行比较时,无法进行范围的缩减,需要与右端点进行比较:
- 中点值比右端点大,则很明显,目标值在中点右半部分(不包括端点),左端点位置为中点位置 + 1
- 中点值比右端点小,则很明显,目标值在中点左半部分(有可能就在端点处),因此右端点位置移至中点位置
- 中点值与右端点一致,则无法确定目标值位置,缩减右半部分区间
class Solution {
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (numbers[mid] > numbers[right]) {
left = mid + 1;
} else if (numbers[mid] < numbers[right]) {
right = mid;
} else {
// 当numbers[mid]==numbers[right]时,无法进行判断
right--;
}
}
return numbers[right];
}
}