0
点赞
收藏
分享

微信扫一扫

162. 寻找峰值———附带思路和详细代码

文章目录

1 题目

在这里插入图片描述

2 思路

使用二分查找来遍历向量,如果该点大于左、右点两个位置的,就返回该值;如果该点小于左相邻点的值,那么峰值一定在左半边的区域(因为-1和n都是-∞;同理,如果该点小于右相邻点的值,那么峰值在右半边的区域),区域缩小为左半区间,剩余的情况,让区间缩小到右半区间。

如果该点为第一个点或者最后一个点,为了方便比较,使用pair作为比较对象,first值除了位置-1和n的值为0外,其余的都为1,second值为nums[i]实际值,这样就可以让位置-1和n都是恒小于所有值。pair可以做比较,先比较first值,在比较second值。

  • 考点:二分,pair

3 代码

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int n = nums.size();
        if(n == 1) return 0;

        auto get = [&](int i) ->pair<int, int>{
            if(i == -1 || i == n) return {0, 0};
            else return {1, nums[i]};
        };

        int l = 0, r = n - 1;
        int ans = -1;
        while(l <= r){
            int mid = (l + r) /2;
            if(get(mid) > get(mid - 1) && get(mid) > get(mid + 1)){
                ans = mid;
                break;
            }else if(get(mid - 1)  > get(mid)){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return ans;
    }
};

/**
          if (get(mid) < get(mid + 1)) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
**/

举报

相关推荐

0 条评论