旋转数组的最小数字
题目链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
思路:排序数组->二分法。题目要求找出「旋转点的值」,因此有以下分析:
- 中点大于右边界,说明旋转点在中点右侧,更新左边界为中点
- 中点小于右边界,说明旋转点在中点左侧,更新右边界为中点
- 中点等于右边界,此时无法判定旋转点在哪个区间,但由于中点和右边界的值相等,因此将右边界-1不会遗漏旋转点的值
参考代码:
class Solution {
public:
int minArray(vector<int>& numbers) {
int upper = numbers.size() - 1;
int lower = 0;
while (lower < upper) {
int pivot = lower + (upper - lower)/2;
if (numbers[pivot] < numbers[upper]) {
upper = pivot;
}
else if (numbers[pivot] == numbers[upper]) {
--upper;
}
else {
lower = pivot + 1;
}
}
return numbers[lower];
}
};