LeetCode 852 山脉数组的峰顶索引[二分法] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 852 山脉数组的峰顶索引[二分法] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
解题思路:
首先浮现于脑海的思路就是暴力遍历,根据题意,就是找到最大值的下标即可,那么遍历一遍返回最大值的下标,代码如下:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int index = 0, maxNum = arr[0];
        for(int i = 1 ; i < arr.size(); i ++) {
            if(arr[i] > maxNum) {
                maxNum = arr[i];
                index = i;
            }
        }
        return index;
    }
};

但是效率肯定惨不忍睹,还有一种方法是回归题意本身,也就是找到第一个左边比右边大的位置,就是山峰位置,返回即可,代码如下:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int i;
        for(i = 0 ; i < arr.size() - 1; i ++) {
            if(arr[i] > arr[i + 1]) {
               return i;
            }
        }
        // 其实这里没什么用
        return i;
    }
};

为了达到O(logn)的复杂度,二分法是必不可少的,如果中间值左边比右边小那么该数在峰左边,否则在峰的右边,一直到左右相遇,就是峰顶的位置,代码如下:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        // 定义左右边界,注意right要是长度减2,不然mid + 1 可能越界
        int left = 0, right = arr.size() - 2;
        while(left < right) {
            // 中间位置
            int mid = (left + right) / 2;
            // 左边比右边小在峰左边,否则在峰的右边
            if(arr[mid] < arr[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
};

以上是关于LeetCode 852 山脉数组的峰顶索引[二分法] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

JS Leetcode 852. 山脉数组的峰顶索引图解分析,高高的山峰一起吹山风吧。

852. 山脉数组的峰顶索引

852. 山脉数组的峰顶索引二分 C++

[E二分] lc852. 山脉数组的峰顶索引(二分+思维+脑筋急转弯)

LeetCode852. 山脉数组的峰顶索引(C++)

Leetcode刷题Python852. 山脉数组的峰顶索引