【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值

【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:


🎬艾莉丝的算法专栏简介:


目录

021  山脉数组的峰顶索引

1.1  思路一:暴力解法

1.1.1  算法思路

1.1.2  算法实现

1.2  思路二:二分查找

1.2.1  算法思路

1.2.2  算法实现

1.3  博主手记

022  寻找峰值

2.1  算法思路:二分查找

2.1.1  算法思路

2.2  算法实现

2.3  博主手记

结尾



021  山脉数组的峰顶索引

力扣链接:852. 山脉数组的峰顶索引

力扣题解链接:二分查找模版解决【山脉数组的峰顶索引】问题

题目描述:

1.1  思路一:暴力解法

1.1.1  算法思路

峰顶的特点:比两侧的元素都要大。
因此,我们可以遍历数组内的每一个元素,找到某一个元素比两边的元素大即可。

1.1.2  算法实现

代码演示如下——

class Solution { public: int peakIndexInMountainArray(vector<int>& arr) { int n = arr.size(); // 遍历数组内每⼀个元素,直到找到峰顶 for (int i = 1; i < n - 1; i++) // 峰顶满⾜的条件 if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) return i; // 为了处理 oj 需要控制所有路径都有返回值 return -1; } };
时间复杂度:O(n),空间复杂度:O(1)。

1.2  思路二:二分查找

1.2.1  算法思路

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

(1)峰顶数据特点:arr[ i ] > arr[i - 1]  &&  arr[ i ] > arr[i + 1]];

(2)峰顶左边的数据特点:arr[ i ] > arr[ i - 1]  &&  arr[ i ] < arr[i + 1],也就是呈现上升趋势;

(3)峰顶右边数据的特点:arr[ i ]<arr[i- 1]&&arr[ i ] > arr[i + 1],也就是呈现下降趋势。

2、因此,根据mid位置的信息,我们可以分为下面三种情况:

(1)如果mid位置呈现上升趋势,说明我们接下来要在[mid + 1,right]区间继续搜索;
(2)如果mid位置呈现下降趋势,说明我们接下来要在[left,mid - 1]区间搜索;
(3)如果mid位置就是山峰,直接返回结果。

1.2.2  算法实现

代码演示如下——

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; } };
时间复杂度:O(logn),空间复杂度:O(1)。

1.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


022  寻找峰值

力扣链接:162. 寻找峰值

力扣题解链接:二分查找模版解决【寻找峰值】问题

题目描述:

2.1  算法思路:二分查找

2.1.1  算法思路

寻找二段性——

任取一个点 i ,与下一个点i + 1,会有如下两种情况:

(1)arr[ i ] > arr[i + 1]:此时【左侧区域】一定会存在山峰(因为最左侧是负无穷),那么我们可以去左侧去寻找结果;

(2)arr[ i ] < arr[i + 1]:此时【右侧区域】一定会存在山峰(因为最右侧是负无穷),那么我们可以去右侧去寻找结果。

当我们找到【二段性】的时候,就可以尝试用【二分查找】算法来解决问题。

2.2  算法实现

代码演示如下——

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]) left = mid + 1; else right = mid; } return left; } };
时间复杂度:O(logn),空间复杂度:O(1)。

2.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


结尾

往期回顾:

【优选算法必刷100题】第019~20题(二分查找算法):x 的平方根、搜索插入位置

结语:都看到这里啦!请大佬不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა


Read more

开箱即用!商品评价爬虫实战,好评差评数据直接拿

开箱即用!商品评价爬虫实战,好评差评数据直接拿

目录 前言 一、核心思路与技术选型 1. 需求背景 2. 技术选型:Selenium 二、环境准备 1. 安装依赖库 2. 配置浏览器驱动 三、代码实现:爬取好评与差评 1. 完整代码(附详细注释) 2. 代码核心拆解 (1)好评爬取逻辑 (2)差评爬取逻辑 四、数据的后续应用 1. 词向量转换 2. 情感分类模型训练 五、注意事项 六、总结 前言         在自然语言处理(NLP)领域,情感分析是极具实用价值的方向之一 —— 比如输入一段商品评价,自动判断其是好评还是差评。而情感分析的前提,是要有高质量的标注数据;本文将分享如何通过 Python+Selenium 爬取苏宁商品的好评与差评数据,

By Ne0inhk
深入解析Spring @AliasFor注解:应用场景与实战示例

深入解析Spring @AliasFor注解:应用场景与实战示例

概述 在Spring框架的注解体系中,@AliasFor注解虽不常被单独提及,却是简化注解使用、提升代码可读性的核心工具。它主要用于为注解属性定义别名,实现属性间的双向绑定,让开发者在使用注解时更灵活。本文将从核心定义、关键特性、应用场景、实战示例四个维度,全面解析@AliasFor注解,帮助开发者真正掌握其用法。 一、@AliasFor注解核心定义与特性 1.1 核心定义 @AliasFor是Spring框架提供的注解(全类名:org.springframework.core.annotation.AliasFor),其核心作用是为注解的属性声明别名,使多个不同名称的属性对应同一个逻辑含义,实现“一个逻辑属性,多个访问入口”。简单来说,就是给注解的属性起“外号”,无论使用哪个名称,最终效果完全一致。 @AliasFor本身有两个核心属性,用于指定别名关系: * value():指定当前属性的别名属性名(默认空字符串); * annotation():指定目标注解的Class对象,仅用于“跨注解(元注解)定义别名”时使用(默认当前注解)

By Ne0inhk
网络原理全景图:从通信起源到 TCP/IP 体系架构深度拆解

网络原理全景图:从通信起源到 TCP/IP 体系架构深度拆解

【深度长文】网络原理全景图:从通信起源到 TCP/IP 体系架构深度拆解 我的主页:寻星探路个人专栏:《JAVA(SE)----如此简单!!! 》《从青铜到王者,就差这讲数据结构!!!》 《数据库那些事!!!》《JavaEE 初阶启程记:跟我走不踩坑》 《JavaEE 进阶:从架构到落地实战 》《测试开发漫谈》 《测开视角・力扣算法通关》《从 0 到 1 刷力扣:算法 + 代码双提升》 没有人天生就会编程,但我生来倔强!!! 寻星探路的个人简介: 一、 网络发展史:从“物理孤岛”到“逻辑互连” 1.1 独立模式 (Standalone) —— 孤岛时代 在计算机诞生的早期,每一台机器都是独立的。文档中描述了一个生动的场景:假设有终端 A、B、

By Ne0inhk
深入解析MySQL(8)——核心日志与备份恢复

深入解析MySQL(8)——核心日志与备份恢复

1.二进制日志 1.1 概述 作用:二进制日志(Binary Log)以二进制格式存储,记录所有修改数据库数据的SQL语句(如insert、update、delete)或事件(如表结构变更) 核心功能: * 主从复制:主库通过二进制日志将数据变更同步到从库 * 数据恢复:配合MySQL 自带的二进制日志解析工具mysqlbinlog,可将二进制日志转换为 SQL 语句并执行 配置: 会话级配置:在命令行客户端中设置变量session sql_log_bin,仅本次连接生效 -- 1 -> 开启 -- 0 -> 关闭 mysql>setsession sql_log_bin =[1|0]

By Ne0inhk