自学内容网 自学内容网

力扣面试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;
    }
}

原文地址:https://blog.csdn.net/lt6666678/article/details/142553040

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!