题解 | #寻找峰值#

寻找峰值

https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        // write code here

        int n=nums.size();
        int left=0;
        int right=n-1;
        int mid;
        while(left<right){
            mid=(left+right)/2;
            if(nums[mid]<nums[mid+1]){
                left=mid+1;
            }
            else if(nums[mid]<nums[mid-1]){
                right=mid-1;
            }
            else{
                return mid;
            }
        }
        return left;
    }
};

最左最右都是最小值,所以只要找到其中的最大值就是峰值。 二分查找。判断nums[mid] 和nums[mid+1]和nums[mid-1]的关系。如果左边的大于中间的。那么对于左边元素来说,要么这个就是峰值,要么再左边的值比这个大。那必然左侧存在峰值。同理右侧也一样。

全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务