二分查找算法——山脉数组的峰顶索引&寻找峰值

news2025/2/23 1:07:45

1.题目解析

题目来源:852.山脉数组的峰顶索引

测试用例

题目来源:162.寻找峰值

测试用例

2.算法原理

山脉数组的峰顶索引 

根据二段性将山脉数组分为两段:上升段与下降段

1.当mid指针落入上升段,说明峰值在mid指针后,要从左边缩小范围,此时将mid给left

2.当mid指针落入下降段,说明峰值在mid指针前,需要从右边缩小范围,此时将mid-1给right即可

注意:由于在处理mid指针时出现了mid-1,则在初始化mid时需要使用left+(right-left+1)/2,而不是left+(right-left)/2,如果是mid+1则是第二种 

寻找峰值 

与前一道题相同但是多了一个条件:nums[0] = nums[n-1] = 负无穷

根据二段性将数组分为两段:上升段与下降段

1.当mid指针落入上升段,说明峰值在mid指针后,要从左边缩小范围,此时将mid给left

2.当mid指针落入下降段,说明峰值在mid指针前,需要从右边缩小范围,此时将mid-1给right即可

注意:由于在处理mid指针时出现了mid-1,则在初始化mid时需要使用left+(right-left+1)/2,而不是left+(right-left)/2,如果是mid+1则是第二种 

为什么可以直接确定峰值的位置在mid的那个位置呢?

因为由于山脚都是负无穷,如果mid在上升段那么即便数组一直处于上升那么最后一个元素也是峰值,相应的在下降段即便数组整体都是降序,那么第一个元素也是峰值,与其纠结上升段前可能会有峰值不如选择上升段后一定有峰值,下降段也是如此,大概可以理解为贪心 

3.实战代码

山脉数组的峰顶索引

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;
            //mid指针落入上升段,将左指针指向mid
            //从左边缩小范围
            if(arr[mid] >= arr[mid - 1])
            {
                left = mid;
            }
            //mid指针落入下降段,将右指针指向mid指针的前一个
            //从右边缩小范围
            else
            {
                right = mid - 1;
            }
        }
        return left;
    }
};

寻找峰值

class Solution {
public:
    int findPeakElement(vector<int>& nums) 
    {
        int left = 0,right = nums.size() - 1;
        while(left < right)
        {
            int mid = left + (right - left) / 2;
            //处于上升段,峰值在mid指针之后
            //从左边缩小范围
            if(nums[mid] < nums[mid + 1])
            {
                left = mid + 1;
            }
            //处于下降段,峰值在mid指针之前
            //从右边缩小范围
            else
            {
                right = mid;
            }
        }
        return left;
    }
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 系统五种帮助命令的使用

Linux 系统五种帮助命令的使用 本文将介绍 Linux 系统中常用的帮助命令&#xff0c;包括 man、–help、whatis、apropos 和 info 命令。这些命令对于新手和有经验的用户来说&#xff0c;都是查找命令信息、理解命令功能的有力工具。 文章目录 Linux 系统五种帮助命令的使用一…

19年408数据结构

第一题&#xff1a; 解析&#xff1a; 设程序执行了K次&#xff0c;则有x K&#xff0c;n<k^2,解得nn^(1/2) 答案选B。 第二题&#xff1a; 解析&#xff1a;这道题直接当作一个结论来记&#xff0c;因为已经出现过很多次了&#xff1a;树的后根遍历和对应二叉树的中序遍…

【异常记录Vue_20241006】使用TagsView后控制台报错

报错截图 报错原因 未将TagsView所依赖的组件permission组件注册到store中&#xff0c;导致TagsView组件在找permission.routes时没找到 解决方法&#xff1a;store注册相应组件

Linux:进程入门(进程与程序的区别,进程的标识符,fork函数创建多进程)

往期文章&#xff1a;《Linux&#xff1a;深入了解冯诺依曼结构与操作系统》 Linux&#xff1a;深入理解冯诺依曼结构与操作系统-CSDN博客 目录 1. 概念 2. 描述进程 3. 深入理解进程的本质 4. 进程PID 4.1 指令获取PID 4.2 geipid函数获取PID 4.3 kill指令终止进程 …

计算机毕业设计 校内跑腿业务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

从零开始构建大型语言模型——实现注意力机制

本章内容&#xff1a; 使用注意力机制的原因基本的自注意力框架&#xff0c;逐步深入到增强的自注意力机制允许LLMs逐个生成词元的因果注意力模块通过dropout随机屏蔽部分注意力权重以减少过拟合将多个因果注意力模块堆叠为多头注意力模块 到目前为止&#xff0c;你已经了解了…

【GeekBand】C++设计模式笔记6_Decorator_装饰模式

1. “单一职责”模式 在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随着需求的变化&#xff0c;子类急剧膨胀&#xff0c;同时充斥着重复代码&#xff0c;这时候的关键是划清责任。典型模式 DecoratorBridge 2. Decorator 装饰模…

Android 内存优化:什么原因导致内存问题?通过内存工具进行分析;内存抖动和内存泄漏;MAT的使用;Profiler的使用;如何优化?

目录 一、为什么要进行内存优化呢&#xff1f; 我们开发一个App程序&#xff0c;如果不了解内存的使用情况&#xff0c;就是将稳定性弃之不管。因为你不知道他在什么时候会发生OOM问题&#xff0c;不知道为什么程序会卡顿&#xff0c;不知道为什么会发生问题。你也没有自信跟别…

算法题之香槟塔

香槟塔 我们把玻璃杯摆成金字塔的形状&#xff0c;其中 第一层 有 1 个玻璃杯&#xff0c; 第二层 有 2 个&#xff0c;依次类推到第 100 层&#xff0c;每个玻璃杯将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟&#xff0c;当顶层的杯子满了&#xff0c;任何溢出的香槟…

【TypeScript】知识点梳理(三)

#void前面提到了代表空&#xff0c;但有个特殊情况&#xff0c;是空不是空&#xff0c;细谈是取舍&#xff0c;但我们不深究hhh# 代码示例&#xff1a; type func () > voidconst f1: func function() {return true; } 定义了空&#xff0c;返回非空值&#xff0c;理论…

Windows搭建RTMP服务器

这里写自定义目录标题 1 Nginx-RTMP服务器搭建1.1 下载Nginx1.2 下载Nginx的RTMP扩展包1.3 配置Nginx1.4 启动Nginx1.5 查看Nginx状态 2 FFmpeg推流2.1 下载FFmpeg2.2 配置FFmpeg环境变量2.3 验证FFmpeg配置 3 视频推流3.1 OBS推流3.2 FFmpeg推流 4 VLC拉流4.1 VLC4.2 打开网络…

vue3+PPTXjs 在线ppt预览

- 使用PPTXjs做ppt预览&#xff0c;有完整的代码包&#xff0c;基于jquery - vue3使用iframe引入用于预览ppt的网页&#xff0c;通过url参数传递需要预览的ppt链接 - 通过网页选择文件上传也可以通过下面的函数把文件转换成链接&#xff0c;实现在文件上传到服务器前就可以预…

【深度强化学习】DDPG实现的4个细节(OUNoise等)

文章目录 前言一、论文内容简述创新点&#xff08;特点&#xff0c;与DQN的区别&#xff09;&#xff1a;可借鉴参数&#xff1a;细节补充&#xff1a; 二、细节1&#xff1a;weight_decay原理代码 三、细节2&#xff1a;OUNoise原理代码 四、细节3&#xff1a;ObsNorm原理代码…

PostgreSQL分区表,实战细节满满

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

茄子病虫害数据集。四类:果肉腐烂、蛀虫、健康、黄斑病。4000张图片,已经按照8:2的比例划分好训练集、验证集 txt格式 含类别yaml文件 已经标注好

茄子病虫害数据集。可用于筛选茄子品质、质量&#xff0c;训练采摘机器人视觉算法模型……数据集大部分图片来源于真实果园拍摄的图片&#xff08;生长在果树之上的&#xff09;&#xff0c;图片分辨率高&#xff0c;数据集分为四类&#xff1a;果肉腐烂、蛀虫、健康、黄斑病。…

如何使用ssm实现基于Java的民宿预订管理系统的设计与实现

TOC ssm773基于Java的民宿预订管理系统的设计与实现jsp 绪论 1.1课题研究背景意义 随着科技的发展&#xff0c;计算机的应用&#xff0c;人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷&#xff0c;网络也遍及到我们生活的每个角落&#x…

Vue - 打包部署

vscode找到NPM脚本&#xff0c;点击build。 目录下出现dist目录则表示安装成功。 安装Nginxnginx: download 目录用途conf配置文件目录html静态资源文件目录logs日志文件目录temp临时文件目录 将刚刚打包好的文件放到html目录下。 点击nginx.exe&#xff0c;用localhost:默认…

Windows应急响应-QQ巨盗病毒

文章目录 病毒背景样本分析开启监控感染病毒分析病毒行为C盘文件监控D盘文件监控进程监控排查服务排查启动项排查 查杀1.杀掉进程2.异常服务3.映像劫持处理4.hosts文件处理5.D盘文件删除6.其他异常排查 重启排查 病毒背景 简介&#xff1a;Win32.PSWTroj.QQPass&#xff0c;名…

模拟退火算法简介

什么是模拟退火算法&#xff1f; 模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;是一种基于随机化搜索的优化算法&#xff0c;灵感来源于金属退火过程。在金属制造中&#xff0c;金属被加热到高温并缓慢冷却&#xff0c;这一过程可以减少内部缺陷&am…

【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

前言&#xff1a;音乐播放器是前端开发中的一个经典项目&#xff0c;通过它可以掌握很多核心技术&#xff0c;如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能&#xff0c;还能让开发者深入理解JavaScript与HTML的协同作用。 页面展示&#xff1…