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

Python 多线程日志错乱:logging.Handler 的并发问题

Python 多线程日志错乱:logging.Handler 的并发问题

Python 多线程日志错乱:logging.Handler 的并发问题 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。 🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。 🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。 目录 Python 多线程日志错乱:logging.Handler 的并发问题 摘要 1. 问题现象与复现 1.1 典型的日志错乱场景 2. logging模块的线程安全机制分析 2.1 Handler级别的线程安全 2.2 锁竞争的性能影响分析 3. 深入源码:竞态条件的根本原因 3.1 Handler.emit()方法的竞态分析 3.2 I/O操作的原子性问题

By Ne0inhk
Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python作为一门简单易学、功能强大的编程语言,近年来在数据分析、人工智能、Web开发等领域广受欢迎。而PyCharm作为一款专业的Python集成开发环境(IDE),提供了强大的代码编辑、调试和项目管理功能,是Python开发者的得力助手。本文将详细介绍如何从零开始安装Python和PyCharm,帮助新手小白快速搭建Python开发环境。 一、安装前准备 在安装Python和PyCharm之前,我们需要做一些准备工作,以确保安装过程顺利进行。 1.检查系统要求 (1)操作系统:Windows 7及以上版本。 如何查看自己的操作系统版本: 按下键盘上的“Windows键 + R”组合键,打开“运行”对话框。 输入winver命令,然后按下“回车”键。弹出的“关于Windows”窗口将显示当前操作系统的详细版本信息,包括版本号、内部版本号和系统构建信息。 此外,也可以鼠标左键单击”此电脑“,然后鼠标单击右键,在打开的对话框中点击”属性“,即可查看此电脑的操作系统版本。 本文将以Windows10专业版为例。 (2)内存:

By Ne0inhk
零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例

零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例

大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)AI大模型零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用 前情摘要 1、零基础学AI大模型之读懂AI大模型 2、零基础学AI大模型之从0到1调用大模型API 3、零基础学AI大模型之SpringAI 4、零基础学AI大模型之AI大模型常见概念 5、零基础学AI大模型之大模型私有化部署全指南 6、零基础学AI大模型之AI大模型可视化界面 7、零基础学AI大模型之LangChain 8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路 9、零基础学AI大模型之Prompt提示词工程 10、零基础

By Ne0inhk