旋转数组的最小数字
    题目链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
    图片.png

    思路:排序数组->二分法。题目要求找出「旋转点的值」,因此有以下分析:

    • 中点大于右边界,说明旋转点在中点右侧,更新左边界为中点
    • 中点小于右边界,说明旋转点在中点左侧,更新右边界为中点
    • 中点等于右边界,此时无法判定旋转点在哪个区间,但由于中点和右边界的值相等,因此将右边界-1不会遗漏旋转点的值

    参考代码:

    1. class Solution {
    2. public:
    3. int minArray(vector<int>& numbers) {
    4. int upper = numbers.size() - 1;
    5. int lower = 0;
    6. while (lower < upper) {
    7. int pivot = lower + (upper - lower)/2;
    8. if (numbers[pivot] < numbers[upper]) {
    9. upper = pivot;
    10. }
    11. else if (numbers[pivot] == numbers[upper]) {
    12. --upper;
    13. }
    14. else {
    15. lower = pivot + 1;
    16. }
    17. }
    18. return numbers[lower];
    19. }
    20. };