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

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

针对山峰数组及寻找峰值问题,利用二分查找优化时间复杂度至 O(log n)。核心在于识别数组的单调性,通过比较中间值与相邻元素判断峰值所在区间。代码采用 C++ 实现,涵盖边界条件处理与区间收缩逻辑。

JavaCoder发布于 2026/3/30更新于 2026/6/1719 浏览
二分查找实战:山峰数组峰顶索引与寻找峰值解析

21. 山峰数组的峰顶索引

题目链接

文章配图

算法思路

解决这类问题的关键在于理解山脉数组的特性。峰顶元素同时大于其左右相邻值,左侧呈上升趋势,右侧呈下降趋势。这种单调性天然适合二分查找。

我们关注中间位置 mid 与其相邻元素的关系:

  • 若 arr[mid] < arr[mid + 1],说明处于上升阶段,峰值在右侧;
  • 若 arr[mid] > arr[mid + 1],说明处于下降阶段,峰值在左侧或即为当前点。

通过不断缩小搜索范围,最终收敛到峰顶索引。

C++ 算法代码

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int left = 0;
        int right = arr.size();
        while(left < right) {
            int mid = left + (right - left) / 2;
            // 对于偶数而言 mid 始终是在左边,所以判断条件是 arr[mid] < arr[mid + 1]
            if(arr[mid] < arr[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        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;
    }
};

文章配图

目录

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

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

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

更多推荐文章

查看全部
  • Dify 集成 Bright Data MCP 实现社媒数据分析自动化
  • 二分查找实战:山脉数组峰顶索引与寻找峰值
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • eNSP 安装教程:依赖环境配置与软件部署指南
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • Spring Cloud Gateway 路由、过滤器与限流机制详解
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • 二分查找算法解析:山峰数组峰顶索引与寻找峰值
  • Windows下安装运用高效轻量本地龙虾机器人ZeroClaw
  • 2026 年各大高校 AIGC 检测政策汇总
  • AI 魔术师:基于视觉的增强现实特效
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • 搭建自然语言处理(NLP)系统的完整流程
  • 鸿蒙 4.2 无线调试不可用时的 ADB 调试与 Shizuku 方案
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • Android 补间动画基础:位移、缩放、旋转与透明度详解
  • 二分查找实战:x 的平方根与搜索插入位置解析
  • 二分查找实战:x 的平方根与搜索插入位置解析
  • Web 前端开发基础核心知识点梳理

相关免费在线工具

  • 加密/解密文本

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