考察知识点:二分

题目分析:

可以将图画出来,以便观察规律。

假设有一个单调下降且每个数都不相同的数组,它旋转后就会变成下图所示的样子:

那我们应该想办法找到上图中发生突变的点。首先我们应该先看序列中最中间的数。如果这个数的前一个数比它大,后一个数比他小,那么它就不是我们想要的结果。这次判断能排除哪一部分的结点呢?我们观察图像,发现当中间的数在靠左边的梯形上时,它的值一定比序列中第一个数小。当中间的数在靠右边的梯形上时,它的值一定比序列中第一个数大。可以根据这个规律判断是排除左边的元素还是右边的元素。

当一个数的左边比较大,右边也比较大时,说明我们找到了答案。

所用编程语言:C++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param heights int整型vector 
     * @return int整型
     */
    int findMin(vector<int>& heights) {
        // write code here
        int size = heights.size();
        int res;
        if (heights[0] > heights[size - 1]) return heights[size - 1];
        int l = 0, r = size - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (heights[mid - 1] > heights[mid] && heights[mid] > heights[mid + 1]) {
                if (heights[mid] > heights[0]) r = mid;
                else l = mid + 1;
            } else {
                if (heights[mid - 1] < heights[mid]) res = heights[mid - 1];
                else res = heights[mid];
                break;
            }
        }
        return res;
    }
};