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

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

山峰数组的峰顶索引与寻找峰值是二分查找的经典应用场景。利用山脉数组先增后减或任意局部极大值的特性,通过比较中间元素与其相邻元素的大小关系,可快速锁定目标位置。相比暴力遍历,该方案将时间复杂度优化为 O(log n)。核心在于构建二段性判断逻辑,配合 C++ 标准库容器实现高效检索,适合算法面试复习与性能敏感场景。

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

21. 山峰数组的峰顶索引

题目描述: 给定一个长度为 n 的山脉数组 arr,其中存在某个索引 i 使得 arr[0] < arr[1] < ... < arr[i-1] < arr[i] > arr[i+1] > ... > arr[n-1]。请找到这个峰顶索引 i。

算法思路: 暴力遍历虽然可行,但效率较低。既然数组具有明显的单调性特征(先增后减),我们可以利用二分查找将时间复杂度优化到 O(log n)。

关键在于判断当前 mid 位置处于上升段还是下降段:

  • 如果 arr[mid] > arr[mid-1],说明当前位置在上升坡或者就是峰顶,目标索引一定在 mid 及其右侧。
  • 如果 arr[mid] < arr[mid-1],说明已经过了峰顶进入下坡路,目标索引一定在左侧。

注意边界处理,由于峰顶不可能在首尾,搜索范围初始化为 [1, size-2]。

C++ 代码实现:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int left = 1, right = arr.size() - 2;
        while (left < right) {
            // 向上取整,防止死循环
            int mid = left + (right - left + 1) / 2;
            if (arr[mid] > arr[mid - 1]) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
};

22. 寻找峰值

题目描述: 给定一个整数数组 nums,找到任意一个峰值元素并返回其索引。数组可能包含多个峰值,返回任何一个即可。假设 nums[-1] = nums[n] = -∞。

算法思路: 这道题比上一道更通用,不要求整个数组是山脉形状,只要求局部极大值。核心思想依然是利用'二段性'进行二分。

任取一点 i 与 i+1 比较:

  • 若 nums[i] > nums[i+1],说明此处正在下降,根据边界负无穷的性质,左侧必然存在一个峰值。
  • 若 nums[i] < nums[i+1],说明此处正在上升,右侧必然存在一个峰值。

通过不断缩小区间,最终 left 和 right 会收敛到同一个峰值索引。

C++ 代码实现:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > nums[mid + 1]) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

总结

这两个问题展示了二分查找在处理有序或半有序数据时的强大能力。解题的关键在于准确定义'二段性',即如何根据中间状态决定搜索方向。在实际编码中,务必注意 mid 的计算方式以及左右边界的更新逻辑,避免死循环或越界。掌握这类模式后,类似的变体问题也能迎刃而解。

目录

  1. 21. 山峰数组的峰顶索引
  2. 22. 寻找峰值
  3. 总结

更多推荐文章

查看全部
  • Python 技术副业实战指南:从入门学习到数据变现路径
  • Java 微信机器人框架 WechatRobot 技术解析与实战
  • Ubuntu 下 AMD AI MAX 395+ 使用 ROCm 加速部署 Qwen 模型
  • 鸿蒙金融理财全栈项目:基础架构、数据安全、用户体验
  • 前端权限管理实现方案与最佳实践
  • ormpp 现代 C++ ORM 框架快速入门
  • Qwen3-VL 视觉编程:从 UI 设计图生成前端代码
  • Python 调用第三方 API 识别携程中文验证码并自动登录
  • 荣耀发布 Robot Phone 与人形机器人 ROBOT,探索 AI 硬件生态
  • 我如何用AI生成ERC20合约交互和监控代码
  • 挖 SRC 时的信息收集方法与工具实践
  • 基于APF-RRT*算法的无人机避障与高效轨迹规划
  • Moon VR Video Player 中文版评测:支持 8K/12K 多音轨及外挂字幕
  • 2024 大模型学习路线:从原理到微调与行业应用实战
  • Android Studio 安装与 SDK、JDK、Gradle 配置详解
  • 通义万相 2.1 助力 AIGC 创作,多模态生成技术解析
  • AI 大模型核心概念、原理与应用全景解析
  • 自适应滑模观测器永磁同步电机仿真模型搭建与无位置传感器算法
  • 无需公网 IP 零端口暴露访问本地 AI 服务方案
  • Python AI 大模型部署实战:本地运行、API 服务与 Docker 封装

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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