数据结构:单调栈

1.单调栈

     单调栈是一种数据结构,其中存放的数据应该是有序的,所以单调栈也有单调递减栈单调递增栈

单调递增栈:栈顶到栈底的元素大小是从小到大
单调递减栈:栈顶到栈底的元素大小是从大到小

     单调栈主要就是用来求一个给定序列中每个数左边离它最近的比它大或小的数。如果找的是比它小的数,就是构造一个单调递减栈;如果找的是比它大的数,那构造的就是一个单调递增栈。

2.单调栈模拟

      假如我们现在有一个序列10,2,8,5,13,我们要找每个数离它最近的比它大的数,我们要构造一个单调递增的栈,则如果栈为空或者入栈的元素大小小于栈顶值,就入栈,否则入栈会破坏栈的单调性,这时候比入栈元素小的元素全部出栈。

      10入栈时,栈为空,直接入栈,栈有一个元素10;

      2入栈时,栈顶元素10比2大,则入栈,栈内元素为10和2;

      8入栈时,栈顶元素2比8小,则栈顶元素出栈,此时栈顶元素为10,比8大,8可以入栈,栈内元素为10和8;

     5入栈时,栈顶8比5大,可以入栈,栈内元素为10,8,5;

     13入栈时,栈顶元素5比13小,出栈;8比13小,出栈;10比13小,出栈,最后栈为空,13入栈,栈内只有12。

      单调递减栈的原理和递增类似

代码:

C:
//构造单调递增栈
int top=0;
for(int i=0;i<n;i++)
{if(top==0||stk[top]>=i}{stk[++top]=i;//当前元素入栈}else{while(top&&stk[top]<i){top--;//出栈}stk[++top]=i;//当前元素入栈}
}//构造单调递减栈
int top=0;
for(int i=0;i<n;i++)
{if(top==0||stk[top]<=i}{stk[++top]=i;//当前元素入栈}else{while(top&&stk[top]>i){top--;//出栈}stk[++top]=i;//当前元素入栈}
}
 C++:
//构造单调递增栈
stack<int>stk;
for(int i=0;i<n;i++)
{while(!stk.empty()&&stk.top()<i){stk.pop()}stk.push(i);
}//构造单调递减栈
stack<int>stk;
for(int i=0;i<n;i++)
{while(!stk.empty()&&stk.top()>i){stk.pop()}stk.push(i);
}

 3.单调栈应用(C++)

     其实我们可以看到这也是类似最近匹配的问题,栈最擅长这种问题了

3.1 每日温度

vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> res(temperatures.size(), 0);stack<int> stk;for (int i = 0; i < temperatures.size(); ++i) {while (!stk.empty() && temperatures[stk.top()] < temperatures[i]) {res[stk.top()] = i - stk.top();stk.pop();}stk.push(i);}return res;}

      给定一个温度序列,让你求每个温度离它最近的比它高的温度是之后第几天,显然符合单调递增栈的特征,我们定义一个栈stk来存储每个温度对应的下标和存储结果的vector数组res,从头开始遍历,如果栈为空或者栈顶下标对应的温度大于当前温度值,则当前温度对应的下标入栈;如果不为空且栈顶下标对应的温度小于当前温度值,说明我们找到了这个温度离它最近的比它高的温度值,那我们就把两个温度对应天数的差值放入res数组中,即res[stk.top()]=i-stk.top(),然后再让栈顶元素出栈,把这个温度对应的下标入栈即可,最后返回结果数组res。

3.2 接雨水

int trap(vector<int>& height) {int ans=0;stack<int>st;for(int i=0;i<height.size();i++){while(!st.empty()&&height[st.top()]<height[i]){int cur=st.top();st.pop();if(st.empty())break;int l=st.top();int r=i;int h=min(height[l],height[r])-height[cur];ans+=(r-l-1)*h;}st.push(i);}return ans;}

       这是一个单调递减栈,当我们找到一根比前面高的柱子时,就可以计算接到的雨水了。更低的柱子我们就入栈,当出现高于栈顶的柱子时,我们就可以计算已经接到的雨水,然后出栈把当前当前的柱子入栈。

        需要注意的是,雨水的右边r是当前的索引i,底部是栈顶st.top(),因为遇到了更高的柱子,所以雨水的左边即将出栈,使用cur来记录它,l就是新的栈顶,这样雨水的区域就确定了,高度就是左右两边更低的一边减去底部,宽度就是左右中间。

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

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

相关文章

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

ESP8266 ESP-01/01s 工作模式与固件下载烧录接线

注意点&#xff1a; ESP8266 ESP-01与 ESP8266 ESP-01s接线类似 。本文使用的是ESP8266 ESP-01 WIFI模块&#xff0c;详细信息见如下图片。本文固件下载的是ESP8266 的MQTT固件&#xff0c;下载其它固件流程一致。本文使用的是杜邦线连接面包板来进行使用&#xff0c;与使用开发…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin&#xff0c;我们除了可以自己…

YOLOv8可视化:引入多种可视化CAM方法,为科研保驾护航

💡💡💡本文内容:调用pytorch下的CAM可视化库,支持十多种可视化方法,打开“黑盒”,让YOLOv8变得相对可解释性 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

Vue Echarts 多折线图只有一条X轴(合并X轴数据并去重排序) - 附完整示例

echarts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&am…

经验分享:构建知识库管理系统只需要这几步

导语&#xff1a; 在当今信息爆炸的时代&#xff0c;构建一个高效的知识库管理系统对于企业来说至关重要。一个好的知识库管理系统可以帮助企业集中管理和共享知识和信息&#xff0c;提高团队的协作效率和创新能力。本文将分享构建知识库管理系统的几个关键步骤&#xff0c;帮…

[Linux] MySQL数据库的备份与恢复

一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1&#xff09;物理备份 物理备份&#xff1a;对数据库操作系统的物理文件&#xff08;如数据文件、日志文件等&#xff09;的备份。 物理备份方法&#xff1a; 冷备份(脱机备份) &#xff1a;是在关闭数据库的时候进…

3D视觉方案的优势

随着机器视觉在工业领域的应用逐渐深入&#xff0c;传统的 2D 视觉方案已经趋向成熟&#xff0c;应用局限性也已经显现出来。 2D 视觉方案易受照明条件影响&#xff0c;一致性和稳定性难以保证&#xff0c;且无法实现三维高精度测量和定位&#xff0c; 3D 视觉方案应运而生&…

奇富科技跻身国际AI学术顶级会议ICASSP 2024,AI智能感知能力迈入新纪元

近日&#xff0c;2024年IEEE声学、语音与信号处理国际会议ICASSP 2024&#xff08;2024 IEEE International Conference on Acoustics, Speech, and Signal Processing&#xff09;宣布录用奇富科技关于语音情感计算的最新研究成果论文“MS-SENet: Enhancing Speech Emotion Re…

如何发送大型文件 ---- 分卷压缩

不知道各位小伙伴有没有这样的烦恼&#xff0c;发送很大很大的压缩包会受到限制&#xff0c;比如QQ邮箱需要付费来进行中转的扩容&#xff0c;下面我将会介绍一种分卷压缩的方法来传送较大的压缩包给对方 使用7-zip软件进行分卷压缩 如果有7-zip压缩软件直接跳过这一步 7-zi…

利用Milvus Cloud和LangChain构建机器人:一种引人入胜且通俗易懂的方法

一、引言 机器人已经深入我们的日常生活&#xff0c;从家庭服务到工业生产&#xff0c;再到医疗和运输等领域。然而&#xff0c;这些机器人往往需要复杂的算法和数据处理技术才能有效地执行任务。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#…

Spring Boot快速搭建一个简易商城项目【一展示商城首页篇】

前言&#xff1a;今天我来使用Spring Boot快速搭建一个简易商城项目以下是相关的思路流程&#xff0c;如果有更好的思路&#xff0c;欢迎大佬评论留言&#xff01;&#xff01;&#xff01; 一&#xff0c;实现思路&#xff1a; 创建 Spring Boot 项目&#xff1a; 使用 Spring…

Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Hikvision SPON IP网络对讲广播系统简介 微信公众…

理解文件系统

一 什么是文件系统 文件系统是计算机操作系统中的一个核心组件&#xff0c;用于管理计算机中的文件和文件夹。它提供了一种组织和访问计算机存储设备上数据的方式。文件系统使用户能够创建、修改、删除和查找文件&#xff0c;以及组织文件和文件夹的层次结构。 ps: linux一共有…

【FPGA】高云FPGA之科学的FPGA开发流程

FPGA开发流程 开发流程1、设计定义2、设计输入3、分析和综合4、功能仿真5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#xff09;FPGA9、在线调试 例子1、设计定义1.1 需求1.2 原理图1.3 真值表 2、设计输入2…

Docker - 镜像 | 容器 | 数据卷 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

软件测试/测试开发丨Pytest学习笔记

Pytest 格式要求 文件: 以 test_ 开头或以 _test 结尾类: 以 Test 开头方法/函数: 以 _test 开头测试类中不可以添加构造函数, 若添加构造函数将导致Pytest无法识别类下的测试方法 断言 与Unittest不同, 在Pytest中我们需要使用python自带的 assert 关键字进行断言 assert…

中介者模式-Mediator Pattern-1

如果在一个系统中对象之间的联系呈现为网状结构&#xff0c; 对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂。 这些对象既会影响别的对象&#xff0c;也会被别的对象所影响。 这些对象称为同事对象&#xff0c;它们之间通过彼此的相互作用实现系统的行为。 在网…

找不到msvcp140.dll怎么办-msvcp140.dll丢失的解决方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。那么&#xff0c;msvcp140.dll究竟是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;本文将详细介绍msvcp140.dll的属性、作用以及丢失的原因&#xff0c;并…

Java学习笔记(八)——面向对象编程(高级)

目录 一、类变量和类方法 &#xff08;一&#xff09;类变量/静态变量 类变量内存布局 类变量使用注意事项和细节 &#xff08;二&#xff09;类方法 类方法经典的使用场景 类方法使用注意事项和细节 二、理解main方法语法 三、代码块 代码块使用注意事项和细节 四、…