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

《算法闯关指南:优选算法--二分查找》--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)讲解二分查找在寻找数组峰值中的应用。以题带点,详细分析了山峰数组的特性:峰顶同时大于左右相邻值,左侧呈上升趋势,右侧呈下降趋势。解题时抓住"二段性"特征,通过比较中间值与相邻元素的关系,逐步缩小搜索范围。

✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど


Read more

macOS 查看与安装 Java JDK 全面指南

macOS 查看与安装 Java JDK 全面指南

📋 目录 * 一、查看 Java 版本 * 1.1 检查是否已安装 Java * 1.2 查看 Java 安装路径 * 1.3 查看已安装的所有 Java 版本 * 1.4 查看 Java 编译器版本 * 二、理解 Java 版本命名 * 2.1 版本命名规则 * 2.2 LTS 版本说明 * 三、安装 JDK 的四种方法 * 方法一:官网下载安装(推荐新手)⭐ * 步骤: * 方法二:使用 Homebrew 安装(推荐开发者)⭐⭐ * 前提:已安装

By Ne0inhk

JDK8-JDK25 全版本特性深度解析

目录 一、Java 版本演进全景图(更新至 2025 年 12 月) 二、分版本核心特性深度解析 (一)奠基阶段:JDK8-JDK11(2014-2018)—— 现代 Java 基础构建 1. JDK8(2014):函数式编程革命 2. JDK9(2017):模块化与工具升级 3. JDK10(2018):类型推断简化开发 4. JDK11(2018,LTS):精简与标准化 (二)孵化阶段:JDK12-JDK16(2019-2021)—— 现代特性预览 1. JDK12:性能与语法优化 2. JDK13:文本与网络增强 3. JDK14:模式匹配与工具增强 4.

By Ne0inhk
《学 Vue3 前需要掌握什么基础?HTML、CSS、JavaScript 与 ES6 一次讲清》

《学 Vue3 前需要掌握什么基础?HTML、CSS、JavaScript 与 ES6 一次讲清》

一、写在前面 很多人刚开始学 Vue3 时,都会有一种很真实的感受: 明明每个知识点单独看都还能理解,但一写代码就开始发懵。 比如看到这样的代码: import { ref } from 'vue' const count = ref(0) const add = () => { count.value++ } 你可能会想: * import 是什么? * 箭头函数为什么这么写? * ref(0) 到底在干嘛? * 为什么后面又有个 .value? 这个时候,很多人会下意识觉得: Vue3 好难。 但实际上,问题往往不完全出在 Vue3 身上,而是因为你在学 Vue 的同时,还在被 JavaScript 基础、ES6 语法、前端页面基础

By Ne0inhk
JAVA 动态代理:从原理剖析到实战应用

JAVA 动态代理:从原理剖析到实战应用

JAVA 动态代理:从原理剖析到实战应用 1.1 本章学习目标与重点 💡 掌握动态代理的核心概念与分类,理解动态代理在 Java 开发中的核心价值。 💡 熟练掌握 JDK 动态代理的实现流程与核心 API,能够独立编写 JDK 动态代理代码。 💡 了解 CGLIB 动态代理的实现原理与适用场景,对比 JDK 动态代理与 CGLIB 动态代理的差异。 💡 结合实际业务场景,掌握动态代理在 AOP 编程、权限控制、日志记录等场景中的实战应用。 ⚠️ 本章重点是 JDK 动态代理的核心实现 和 动态代理在 AOP 中的实战应用,这是 Java 高级开发与框架设计的必备技能。 1.2 动态代理的核心概念与价值 1.2.1 什么是动态代理 💡 动态代理 是

By Ne0inhk