LeetCode 162 Find Peak Element

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

click to show spoilers.

Note:

Your solution should be in logarithmic complexity.

题目本身不难,要求对数复杂度求解。

不会做。。。于是看看网上的题解,没咋看懂,和同学讨论讨论有点明白了。

题目我理解像题目的名字一样,找峰值,那就画一座山,把值理解为高度,且没有相邻的两点高度一样(num[i] ≠ num[i+1]),两边是万丈深渊(num[-1] = num[n] = -∞),在对数复杂度内找到一个山峰,找的一个即可,是存在性问题。对数的话,第一感觉就是二分法,如何证明二分法有效呢?上图:


假设高度是连续的,有题我们可以得出,最左边的的斜率k>0,最右边k<0,由二分法得出的中点处mid,计算mid和右边或左边相邻点的斜率由其符号可知在左或右边一定存在斜率由正到负或者负到正的跳变,跳变处即是峰值,解出一个峰值即可。

上码,注意一些细节的处理:

class Solution {
public:
    int findPeakElement(const vector<int> &num) {
        int l = 0;
        int r = num.size()-1;
        int mid;
        
        while(l < r)
        {
            mid = (l+r)/2;   
            
            if(num[mid]<num[mid+1])
                l = mid+1;
            else r = mid;    
        }
        
        return l;
        
        
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值