《算法题讲解指南:优选算法-二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值

《算法题讲解指南:优选算法-二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

21. 山峰数组的的峰顶索引

题目链接:

题目描述:

题目示例:

解法(二分查找):

算法思路:

C++算法代码:

算法总结及流程解析:

22. 寻找峰值

题目链接:

题目描述:

题目示例:

解法(二分查找):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


21. 山峰数组的的峰顶索引

题目链接:

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

题目描述:

题目示例:

解法(二分查找):

算法思路:

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

  • 峰顶数据特点: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 = 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; //区间划分:[ 小于等于峰值 ], [ 大于峰值 ](相当于查找右端点) int left = 0; int right = arr.size(); while(left < right) { int mid = left + (right - left + 1) / 2; //对于偶数而言mid始终是在右边,所以判断条件是arr[mid - 1] < arr[mid] if(arr[mid - 1] < arr[mid]) { left = mid; } else { right = mid - 1; } } return left; } };

算法总结及流程解析:

22. 寻找峰值

题目链接:

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

题目描述:

题目示例:

解法(二分查找):

算法思路:

      寻找二段性:任取一个点 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; 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; } };

算法总结及流程解析:

结束语

      到此,21.山峰数组的的峰顶索引,22.寻找峰值 这两道算法题就讲解完了。以题带点,详细分析了山峰数组的特性:峰顶同时大于左右相邻值,左侧呈上升趋势,右侧呈下降趋势。解题时抓住"二段性"特征,通过比较中间值与相邻元素的关系,逐步缩小搜索范围。希望大家能有所收获!

Read more

Linux 环境基础开发工具详解

Linux 环境基础开发工具详解

引言 Linux 环境下的开发工具非常丰富,是程序员和开发人员进行高效开发的必备基础。本篇文章将深入介绍 Linux 环境下的基础开发工具,包括软件包管理器、文本编辑器、编译器、调试工具、自动化构建工具以及版本管理工具等。通过本文的学习,读者将掌握在 Linux 系统中如何配置开发环境、编写代码、编译、调试以及进行版本控制等关键技能。 一、Linux 软件包管理器 yum 1.1 什么是软件包? 在 Linux 中,软件包是经过预编译、打包的应用程序或工具,它类似于 Windows 系统中的安装程序。软件包可以通过包管理器进行管理,简化软件的安装、更新和卸载过程。常见的软件包后缀包括 .rpm、.deb 等。 1.2 yum 工具简介 yum(Yellow dog Updater, Modified)

By Ne0inhk

VSCode AI Copilot补全准确率提升80%的4种配置方法,资深架构师都在用

第一章:VSCode AI Copilot代码补全的核心机制 VSCode AI Copilot 通过深度学习模型理解上下文语义,实现智能代码补全。其核心依赖于 GitHub 与 OpenAI 联合训练的大型语言模型,能够根据当前文件的变量名、函数结构和注释内容推测出最可能的下一行代码。 工作原理概述 AI Copilot 在用户输入过程中实时分析光标前后的代码片段,并结合数百万开源项目中的编码模式生成建议。模型不仅识别语法结构,还能理解命名惯例和设计模式。 * 监听用户键入行为并提取上下文特征 * 将上下文编码为向量输入预测模型 * 返回多个候选代码片段供选择 启用与配置示例 确保已安装 VSCode 及 GitHub Copilot 插件后,可通过以下设置优化补全体验: { "github.copilot.enable": { "editorLangId": true }, "editor.inlineSuggest.enabled": true, "

By Ne0inhk

终极指南:如何快速上手高性能Whisper.cpp语音识别项目

终极指南:如何快速上手高性能Whisper.cpp语音识别项目 【免费下载链接】whisper.cppOpenAI 的 Whisper 模型在 C/C++ 中的移植版本。 项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp Whisper.cpp是OpenAI Whisper模型在C/C++中的高性能移植版本,为开发者提供轻量级、跨平台的自动语音识别解决方案。这个项目支持多种硬件优化,包括Apple Silicon、AVX指令集和Vulkan等,让语音识别技术更加普及和易用。 🔥 项目核心优势与特色功能 Whisper.cpp的最大亮点在于其卓越的性能表现和广泛的平台兼容性。通过GGML量化技术,模型体积大幅减小,同时保持高质量的识别效果。该项目支持从微型到大型的多种模型规格,满足不同场景下的需求。 多平台全面支持 项目覆盖了从桌面端到移动端的完整生态: * 桌面系统:macOS(Intel和Arm)、Linux、FreeBSD、Windows * 移动平台:

By Ne0inhk
硕士开题报告不再难!paperzz智能写作功能实测:30分钟搞定导师认可的开题报告

硕士开题报告不再难!paperzz智能写作功能实测:30分钟搞定导师认可的开题报告

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 开题报告https://www.paperzz.cc/proposal "开题报告改了8遍,导师还是说逻辑不清晰!" "参考文献找得眼花,提纲框架改了又改!" "距离开题截止只剩3天,通宵赶报告到崩溃!" 如果你也经历过这些"开题渡劫",那么恭喜你——paperzz硕士开题报告写作功能 正在用"AI+学术规范"的组合拳,彻底重构开题报告写作流程。今天,我们就来深度拆解这个工具如何让开题报告从"痛苦源"变成"效率王",并附上超详细操作指南,让你看完就能上手! 一、开题报告写作的"三大痛点&

By Ne0inhk