《算法闯关指南:优选算法--二分查找》--21.山峰数组的的峰顶索引,22.寻找峰值
🔥草莓熊Lotso:个人主页
❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受。
🎬博主简介:
目录
前言:
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=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)
题目描述:
题目示例:
解法(二分查找):
算法思路:
寻找二段性:任取一个点 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;}
};
算法总结&&笔记展示:
笔记字有点丑,大家见谅:
结尾:
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:本文通过两道力扣算法题(852、162)讲解二分查找在寻找数组峰值中的应用。以题带点,详细分析了山峰数组的特性:峰顶同时大于左右相邻值,左侧呈上升趋势,右侧呈下降趋势。解题时抓住"二段性"特征,通过比较中间值与相邻元素的关系,逐步缩小搜索范围。
✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど