《算法闯关指南:优选算法--二分查找》--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

Linux 动静态库完全指南:制作、使用、原理与实战

Linux 动静态库完全指南:制作、使用、原理与实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 库的基础认知:是什么?有哪些? * 1.1 库的本质 * 1.2 库的分类与系统位置 * 1.3 预备工作:自定义库源码 * 二. 静态库:编译时链接,独立运行 * 2.1 整体图示:理清思路 * 2.2 静态库制作流程(Makefile 自动化,更简便) * 2.3 静态库使用场景与命令 * 2.4 静态库核心特点 * 三. 动态库:运行时链接,

By Ne0inhk
鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化

鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化

《鸿蒙APP开发从入门到精通》第25篇:鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代优化 🚀📱🔧 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第25篇——上线与运维、用户反馈、持续迭代优化篇,100%承接第24篇的生态合作、用户运营优化、数据产品变现优化架构,并基于金融场景的上线与运维、用户反馈、持续迭代优化要求,设计并实现鸿蒙金融理财全栈项目的上线与运维、用户反馈、持续迭代优化功能。 学习目标: * 掌握鸿蒙金融理财项目的上线与运维优化设计与实现; * 实现应用上线优化、应用运维优化、应用监控优化; * 理解用户反馈在金融场景的核心优化设计与实现; * 实现用户反馈收集优化、用户反馈分析优化、用户反馈处理优化; * 掌握持续迭代优化在金融场景的设计与实现; * 实现持续集成优化、持续部署优化、持续交付优化; * 优化金融理财项目的用户体验(上线与运维、用户反馈、持续迭代优化)。 学习重点: * 鸿蒙金融理财项目的上线与运维优化设计原则; * 用户反馈在金融场景的优化应用; * 持续迭代优化在金融场景的设计要点。 一、

By Ne0inhk
Flutter 三方库 dart_test_utils 的鸿蒙化适配指南 - 实现具备单元测试增强与 Mock 逻辑简化的质量保障体系、支持端侧测试用例工程化流水线实战

Flutter 三方库 dart_test_utils 的鸿蒙化适配指南 - 实现具备单元测试增强与 Mock 逻辑简化的质量保障体系、支持端侧测试用例工程化流水线实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 dart_test_utils 的鸿蒙化适配指南 - 实现具备单元测试增强与 Mock 逻辑简化的质量保障体系、支持端侧测试用例工程化流水线实战 前言 在进行 Flutter for OpenHarmony 开发时,高质量的测试是确保应用在复杂分布式环境下不退化的唯一手段。虽然 Dart 自带了 test 库,但在处理一些重复的测试脚手架代码(如日期 Mock、随机数据生成、异常断言增强)时,依然显得繁琐。dart_test_utils 是一款旨在为 Dart 测试注入更高生产力的辅助库。本文将探讨如何在鸿蒙端构建极致、专业的测试保障体系。 一、原直观解析 / 概念介绍 1.1 基础原理 该库提供了一系列针对测试用例编写的“

By Ne0inhk
Flutter 三方库 notion_api 的鸿蒙化适配指南 - 实现 Notion 工作区的全量连接、支持数据库项 CRUD、块内容编辑与自动化文档同步

Flutter 三方库 notion_api 的鸿蒙化适配指南 - 实现 Notion 工作区的全量连接、支持数据库项 CRUD、块内容编辑与自动化文档同步

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 notion_api 的鸿蒙化适配指南 - 实现 Notion 工作区的全量连接、支持数据库项 CRUD、块内容编辑与自动化文档同步 前言 在进行 Flutter for OpenHarmony 的效率类或知识管理应用开发时,将 Notion 作为后台数据库或内容管理中心已成为许多独立开发者的首选。notion_api 是一个专为 Notion 官方 API 设计的封装库,它能让你在鸿蒙端以对象化的方式快速操控 Notion 页面。本文将探讨如何在鸿蒙系统下构建属于你的“Notion 增强版”应用。 一、原理解析 / 概念介绍 1.1 基础原理 notion_api 核心是对 Notion

By Ne0inhk