跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

二分查找实战:山峰数组峰顶索引与寻找峰值

二分查找是解决有序或半有序数组问题的利器。针对山峰数组峰顶索引与寻找峰值两道经典题目,核心思路均基于“二段性”判定。通过分析中间元素与相邻元素的大小关系,将搜索区间缩小一半。山脉数组需区分左右两侧单调性,普通峰值则利用无穷边界特性。C++ 实现中需注意 mid 取值策略防止死循环,确保时间复杂度控制在 O(log n)。掌握此类变体有助于应对更多二分查找变种场景。

leon发布于 2026/3/26更新于 2026/10/872 浏览
二分查找实战:山峰数组峰顶索引与寻找峰值

21. 山峰数组的峰顶索引

题目描述

文章配图

题目示例

文章配图

解法:二分查找

思路分析

观察山峰数组的特性,峰顶位置满足 arr[i] > arr[i-1] && arr[i] > arr[i+1]。其左侧呈上升趋势(arr[i] < arr[i+1]),右侧呈下降趋势(arr[i] > arr[i+1])。这种单调性变化构成了典型的'二段性',非常适合用二分查找来定位转折点。

具体策略如下:

  • 若 mid 位置的值小于 mid+1 位置的值,说明处于上升阶段,峰顶在右侧,调整左边界。
  • 若 mid 位置的值大于 mid+1 位置的值,说明处于下降阶段或已是峰顶,调整右边界。
C++ 实现
class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int left = 0;
        int right = arr.size();
        while(left < right) {
            // 向上取整防止死循环,当 left + 1 == right 时 mid = right
            int mid = left + (right - left + 1) / 2;
            
            // 判断 mid 是否处于上升段
            if(arr[mid - 1] < arr[mid]) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
};
流程解析

文章配图

22. 寻找峰值

题目描述

文章配图

题目示例

文章配图

解法:二分查找

思路分析

这道题不需要找到全局最大值,只要找到一个局部峰值即可。关键在于利用数组两端可视作负无穷的假设。

任取一个点 i,比较它与下一个点 i+1:

  • 如果 nums[i] > nums[i+1],说明当前处于下降坡道,左侧必然存在一个峰值(因为最左边是负无穷),向左搜索。
  • 如果 nums[i] < nums[i+1],说明当前处于上升坡道,右侧必然存在一个峰值(因为最右边是负无穷),向右搜索。

一旦确定了这种二段性,就可以套用二分模板快速收敛。

C++ 实现
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] < nums[mid + 1]) {
                // 上升阶段,峰值在右侧
                left = mid + 1;
            } else {
                // 下降阶段,峰值在左侧或当前位置
                right = mid;
            }
        }
        return left;
    }
};
流程解析

文章配图

总结

这两道题都利用了二分查找的核心思想——通过比较中间状态来排除一半的搜索空间。山峰数组侧重于单调性的转折,而寻找峰值则利用了边界无穷大的特性。在实际编码中,务必注意 mid 的计算方式以及边界条件的更新,避免陷入死循环。理解这些细节后,面对类似的变体题目也能游刃有余。

目录

  1. 21. 山峰数组的峰顶索引
  2. 题目描述
  3. 题目示例
  4. 解法:二分查找
  5. 思路分析
  6. C++ 实现
  7. 流程解析
  8. 22. 寻找峰值
  9. 题目描述
  10. 题目示例
  11. 解法:二分查找
  12. 思路分析
  13. C++ 实现
  14. 流程解析
  15. 总结

更多推荐文章

查看全部
  • QGroundControl 跨平台安装指南:Windows、macOS、Linux 与 Android 部署实战
  • AI 编程工具 Trae 国内外版本对比与选择指南
  • Python 数据分析全流程指南:从基础到建模实战
  • 学术论文避坑指南:降低重复率与 AIGC 检测风险的策略
  • Stable Diffusion 报错排查:CheckpointLoaderSimple 模型文件缺失修复
  • 前端 SSR 技术解析:优化 SEO 与用户体验
  • Visual Studio GitHub Copilot 大模型选择与配置
  • C++ 模板编程基础:泛型编程入门与实践
  • 如何将 Android 项目上传至 GitHub
  • 2026 AI 编码工具对比:Claude Code、Cursor 与 GitHub Copilot 选型指南
  • 找羊开源加热台硬件与固件设计解析
  • 昇腾 NPU 部署与推理 Llama 模型实战指南
  • IntelliJ IDEA 运行时报错 ExceptionInInitializerError 解决方案
  • ROS 导航中 mpc_local_planner 的高效避障与参数调优
  • 利用国内镜像站高效拉取开源大模型及多模态资源
  • 深度解读混合专家模型(MoE):算法、演变与原理
  • MySQL Windows 版安装与验证指南
  • MacBook 配置 FRP 端口转发遇到 Token 不匹配错误解决
  • 解决 LLaMA-Factory 微调 InternVL3 报错 Processor was not found
  • AI 驱动知识管理的低代码落地方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online