力扣面试150 寻找峰值 二分

Problem: 162. 寻找峰值
在这里插入图片描述

👨‍🏫 参考图解

在这里插入图片描述

class Solution {
    public int findPeakElement(int[] nums) {
        int l = 0;  // 初始化左边界,表示数组的起始位置
        int r = nums.length - 1;  // 初始化右边界,表示数组的结束位置

        // 当左边界和右边界没有重合时,持续二分查找
        while(l < r){
            // 计算中间位置,避免整数溢出(相当于 (l + r) / 2)
            int m = l + (r - l) / 2;

            // 判断当前位置的元素与右边相邻元素的关系
            if(nums[m] > nums[m + 1]){
                // 如果当前元素大于右边相邻的元素,说明中点处于一个“下坡”阶段,
                // 峰值可能在左侧(包括当前元素,因为它可能是一个峰值)
                r = m;  // 收缩右边界到中点位置,继续在左半部分查找
            } else {
                // 如果当前元素小于或等于右边相邻元素,说明中点处于“上坡”阶段,
                // 峰值一定在右侧区域
                l = m + 1;  // 左边界移动到中点的右侧,继续在右半部分查找
            }
        }

        // 最终,左右边界会收缩至同一点,此时该点一定是一个峰值
        return l;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值