当前位置: 首页 > news >正文

3.5 二分查找专题:LeetCode 852. 山脉数组的峰值

1. 题目链接

LeetCode 852. 山脉数组的峰值索引


2. 题目描述

给定一个山脉数组 arr(先严格递增后严格递减),返回其峰值的索引。
示例

  • 输入:arr = [0,1,0] → 输出:1
  • 输入:arr = [0,2,1,0] → 输出:1

3. 示例分析
  1. 标准山脉数组
    • arr = [1,3,5,4,2],峰值为 5,索引为 2
  2. 峰值在中间
    • arr = [0,10,100,50,20],峰值为 100,索引为 2

4. 算法思路

二分查找法

  1. 二段性分析
    • 山脉数组分为递增段(arr[i] > arr[i-1])和递减段(arr[i] < arr[i-1])。
    • 对于任意 mid,若 arr[mid] > arr[mid-1],说明峰值在右侧;否则在左侧。
  2. 实现步骤
    • 初始化 left = 1, right = arr.size() - 1
    • 计算 mid(向上取整,防止死循环)。
    • 根据 arr[mid]arr[mid-1] 的关系调整左右边界。
    • 最终 left == right,返回峰值索引。
  3. 核心思想通过局部条件将搜索范围一分为二,逐步逼近目标。

5. 边界条件与注意事项
  1. 数组长度:题目保证 arr.length ≥ 3,无需处理边界。
  2. 峰值位置
    • 峰值不可能在首尾(arr[0]arr[-1] 无法同时满足递增和递减)。
  3. 死循环避免mid 必须向上取整(例如 left=1, right=2 时,mid=2)。

6. 代码实现
class Solution 
{
public:
    int peakIndexInMountainArray(vector<int>& arr) 
    {
        int left = 1, right = arr.size() - 1;
        while(left < right)
        {
            int mid = left + (right - left + 1 ) / 2;
            if(arr[mid] > arr[mid - 1]) left = mid;
            else right = mid - 1;
        }
        return left;
    }
};

在这里插入图片描述

7.暴力枚举法与二分查找法对比图表
对比维度暴力枚举法二分查找法
核心思想遍历数组,找到第一个 arr[i] > arr[i+1] 的索引。利用二段性,每次将搜索范围缩小一半。
时间复杂度O(n)(遍历所有元素)。O(log n)(每次缩小一半范围)。
空间复杂度O(1)(无需额外存储)。O(1)(仅需常数变量记录指针)。
实现方式单层循环逐个比较相邻元素。动态调整左右指针,通过条件判断缩小范围。
适用场景小规模数据(n ≤ 1e3)。大规模数据(n ≥ 1e6)。
优点实现简单,无需数学分析。时间复杂度极低,适合处理大规模数据。
缺点数据规模大时性能极差(例如 n=1e5 时需 1e5 次操作)。需理解二段性,实现逻辑较复杂。

8.关键点总结
  1. 二段性
    • 数组分为递增段和递减段,任意位置 mid 可通过 arr[mid] > arr[mid-1] 判断峰值方向。
    • 即使数组不全局有序,只要存在明确的二段性,即可应用二分查找。
  2. 中间值取整
    • 使用 mid = left + (right - left + 1) / 2(向上取整),避免死循环。
  3. 边界收缩逻辑
    • arr[mid] > arr[mid-1],峰值在右侧(含 mid);否则在左侧(不含 mid)。

相关文章:

  • 单片机自学总结
  • 如何搭建一个安全经济适用的TRS交易平台?
  • Linkreate wordpressAI插件 24小时自动生成原创图文,新增从百度、必应搜索引擎自动获取相关下拉关键词
  • SpringBoot第三站(4):配置嵌入式服务器使用外置的Servlet容器
  • LeetCode56☞合并区间
  • 超参数优化算法:scikit-opt库、Scikit-Optimize库
  • GPU视频编解码:X86 VideoProcessFrame 视频编解码入门(二)
  • Git提交前时间检查
  • Golang | 每日一练 (6)
  • Mysql 安装指南(小白入门)
  • 基于FPGA轨道交通6U机箱CPCI脉冲板板卡
  • vs2017版本与arcgis10.1的ArcObject SDK for .NET兼容配置终结解决方案
  • 【笔记】计算机网络——数据链路层
  • 10.PE导出表
  • 3.8 Spring Boot监控:Actuator+Prometheus+Grafana可视化
  • 【vue2 + Cesium】使用Cesium、添加第三方地图、去掉商标、Cesium基础配置、地图放大缩小事件、获取可视区域、层级、高度
  • Python第六章01:列表(lsit)定义语法
  • ESP32(3)UDP通信
  • 【Linux篇】:进程抢占式调度的量子纠缠--状态,优先级与上下文切换的三角博弈
  • python基础8 单元测试
  • 豆神教育:2024年净利润1.37亿元,同比增长334%
  • 探索演艺产业新路径,2万观众走进音乐科技融创节
  • 中方发布《不跪!》视频传递何种信息?外交部回应
  • 遭遇大规模停电,西班牙内政部宣布进入国家紧急状态
  • 柴德赓、纪庸与叫歇碑
  • 格力电器去年净利增长一成:消费电器营收下滑4%,一季度净利增长26%