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

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

二分查找解决山峰数组峰顶索引及寻找峰值问题。针对山脉数组,利用峰顶两侧单调性特征,通过比较中间值与其相邻元素判断搜索方向。若 mid 大于前驱则向左收缩,否则向右。对于寻找峰值问题,任取一点与后点比较,根据大小关系确定存在峰值的区间,最终收敛至峰值位置。提供 C++ 代码实现,时间复杂度 O(log n)。

监控大屏发布于 2026/3/25更新于 2026/10/2388 浏览
二分查找:山峰数组的峰顶索引与寻找峰值

21. 山峰数组的峰顶索引

题目链接:

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

题目描述:

![Description Image Removed]

题目示例:

![Example Image Removed]

解法(二分查找):

这里暴力解法大家自己实现一下,我就不实现了

算法思路:

分析峰顶位置的数据特点,以及山峰两旁的数据的特点:

  • 峰顶数据特点:arr[i] > arr[i-1] && arr[i] > arr[i+1]
  • 峰顶左边的数据特点:arr[i] > arr[i-1] && arr[i] < arr[i+1],呈上升趋势
  • 峰顶右边数据的特点:arr[i] < arr[i-1] && arr[i] > arr[i+1],呈下降趋势

由此我们可以分为以下两种情况:

  • 如果 mid 位置的值小于 mid-1 位置的值 left=mid;
  • 如果 mid 位置的值大于 mid-1 位置的值 right=mid-1;
二分查找解法代码(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. 寻找峰值

题目链接:

162. 寻找峰值 - 力扣(LeetCode)

题目描述:

![Description Image Removed]

题目示例:

![Example Image Removed]

解法(二分查找):
算法思路:

判断二段性:任取一个点 i,与下一个点 i+1,会有如下两种情况:

  • arr[i] > arr[i+1]:此时**【左侧区域】**一定会存在山峰(因为最左侧是负无穷),那么我们就可以去左侧寻找结果
  • arr[i] < arr[i+1]:此时**【右侧区域】**一定会存在山峰(因为最右侧是负无穷),那么我们就可以去右侧寻找结果

点睛之笔:如果我们找到了二段性,就可以尝试用二分法解题了!

二分查找解法代码(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. 解法(二分查找):
  3. 算法思路:
  4. 二分查找解法代码(C++):
  5. 22. 寻找峰值
  6. 解法(二分查找):
  7. 算法思路:
  8. 二分查找解法代码(C++):

更多推荐文章

查看全部
  • AI 产品经理核心能力体系与职业发展路径
  • Qwen2.5 代码补全实测:低成本替代 GitHub Copilot 方案
  • SpringBoot 集成 KingbaseES 数据库实践指南
  • 电商产品 AI 绘画提示词撰写实战指南
  • Python 原生实现 KaiwuDB 时序数据库连接池方案
  • TDD 实战:如何用测试驱动编写更优的 Python 代码
  • 基于 Cogito-V1-Preview-Llama-3B 的微信小程序 AI 对话集成指南
  • llama.cpp Docker 部署:容器化推理服务搭建
  • 深度 Q 网络与知识图谱融合:映射机制深度解析
  • 用两个栈模拟队列:LIFO 到 FIFO 的转换实现与原理分析
  • VR 科普学习机赋能新课堂
  • 国外主流网络安全与黑客技术论坛及资源导航
  • C++ 搜索引擎项目:正倒排索引数据清洗代码详解(上)
  • OpenCV 拉普拉斯算子边缘检测原理与实现
  • 异构算力部署通义万相 2.1 文生图技术解析
  • 天工 AI 辅助产品经理工作流程与多模态功能体验
  • 多模态大模型原理与跨模态应用实战
  • 使用 n8n 打造个人社交媒体内容同步机器人
  • 8 个适合 Python 开发的接单平台及兼职建议
  • Android 开发中组件化的核心价值与架构实践

相关免费在线工具

  • 加密/解密文本

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