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

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

二分查找解决山脉数组峰顶索引与寻找峰值问题。利用数组单调性特征,在 O(log n) 时间内定位极值点。前者针对严格先增后减的山脉结构,后者适用于任意存在峰值的数组环境。核心在于通过比较中间值与邻居大小,判断峰值位于左半区还是右半区,从而不断收缩搜索空间。

MongoKing发布于 2026/3/29更新于 2026/7/2328 浏览
二分查找实战:山峰数组峰顶索引与寻找峰值

21. 山峰数组的峰顶索引

题目描述: 给定一个长度为 n 的山脉数组 arr,其中存在某个索引 i (0 < i < n - 1) 使得:

  • arr[0] < arr[1] < ... < arr[i]
  • arr[i] > arr[i+1] > ... > arr[n-1]

请返回满足条件的峰顶索引 i。

算法思路: 暴力遍历虽然可行,但效率较低。利用山脉数组先增后减的特性,我们可以使用二分查找将时间复杂度优化至 O(log n)。

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

  • 若 arr[mid] > arr[mid-1],说明 mid 位于上升段或就是峰顶,目标在 [mid, right] 区间;
  • 若 arr[mid] < arr[mid-1],说明 mid 位于下降段,目标在 [left, mid-1] 区间。

注意边界处理,由于峰顶不在两端,初始搜索范围可设为 [1, n-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] = -∞。

算法思路: 这道题同样可以利用二分查找解决。核心在于识别'二段性':对于任意中间点 mid,比较它与相邻元素的大小关系。

  • 如果 nums[mid] > nums[mid+1],说明当前处于下降趋势,峰值一定在左侧(包括 mid);
  • 如果 nums[mid] < nums[mid+1],说明当前处于上升趋势,峰值一定在右侧(不包括 mid)。

通过不断缩小搜索区间,最终 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;
    }
};

总结

这两个问题展示了二分查找在处理局部极值时的强大能力。与普通二分查找不同,这里不需要完全有序,只需要具备单调性或二段性特征即可。掌握这种'根据趋势收缩区间'的思路,能解决许多看似无序的搜索问题。

目录

  1. 21. 山峰数组的峰顶索引
  2. 22. 寻找峰值
  3. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 辅助小说创作实战指南:平台规则与收益分析
  • C++26 标准前瞻:std::future 取消机制与并发编程革命
  • LeetCode 二分查找算法入门与实战
  • 7 款实用的 Python 身份验证与授权库推荐
  • OpenClaw 跨平台 AI 助手完全使用指南:从入门到进阶
  • AI 产品经理转型指南:职责、薪资与核心能力模型
  • 三年前端转 CS 硕士:我在韩国亚大的留学复盘与回归前端
  • 基于 SSM 和 Vue 的 Web 在线投稿系统设计与实现
  • AI 提示词工程:核心原理、设计策略与实战指南
  • OpenClaw 实战:AI 摄像头访问与 WSL2 解决方案
  • 腾讯 QClaw 本地 AI Agent 框架安装与使用指南
  • MetaAPP 前端一面面经:Vue 原理、CSS 动画与 JS 特性解析
  • OpenClaw 本地部署指南:快速搭建自托管 AI 助手
  • ComfyUI 节点工作流 AI 绘画工具解析
  • 基于 1300+ 招聘数据分析:自学 Python 的就业门槛与要求
  • Android WebView 开发指南:AgentWeb 完整使用
  • Jenkins 实战:多仓库集成、自动构建与公网远程部署
  • AI 无人机智慧巡检平台:架构、功能与应用场景
  • VS Code 内置聊天与 GitHub Copilot Chat 的区别及使用指南
  • 从 PX4 到 Gazebo:无人机视角跟随技术的演进与优化策略

相关免费在线工具

  • 加密/解密文本

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