数据结构:单调栈

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;与使用开发…

《人生何处不相逢》歌词解析

很少仔细思考某首歌的歌词&#xff0c;上次解析还是费玉清的《一剪梅》&#xff0c;不过那个在我的小红书上&#xff0c;这首歌曲子罗大佑的作品&#xff0c;简宁填词&#xff0c;陈慧娴演唱&#xff0c;表达了对缘分的无常和缘尽的伤感&#xff0c;以及缘分的可贵 1.随浪随风…

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 💡💡💡全网独家首发创新(原创),适…

代理IP使用的IP协议有哪些?优质的动态IP有什么特征?

一、代理IP使用的IP协议 代理IP使用的主要IP协议有三种&#xff1a;HTTP协议、SOCKS协议和FTP协议。 1. HTTP协议&#xff1a;是最常用的协议&#xff0c;通过HTTP协议传输的数据是明文&#xff0c;它可以在任意多的机器上使用&#xff0c;并且工作方式是可靠的。它是一个无状态…

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 视觉方案应运而生&…

第二百三十二回

文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"自定义TimePicker组件"相关的内容&#xff0c;本章回中将继续介绍该组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回…

奇富科技跻身国际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…

vue中的路由

目录 一、路由基础 路由机制 1.声明路由对象数组 2.创建路由器实例对象 3.将路由器实例注册vue根实例 4.通过router-link标签访问组件 5.路由导航守卫 二、动态路由匹配 响应路由参数的变化/监听路由url地址栏参数变化&#xff1f; 一、路由基础 路由机制 通过路由加载组件…

11.map 容器

11、map 容器 简介&#xff1a; map 中所有元素都是 pairpair 中第一个元素为 key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为 value&#xff08;实值&#xff09;所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap 属…

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

不知道各位小伙伴有没有这样的烦恼&#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…

一种用于解决子图同构问题的子图特定因子

判断两个图是否同构可以从两个方面考虑 当两个图的节点的个数不等时&#xff1a;显然&#xff0c;这两个图是不可能同构。当两个图的节点的个数相等时&#xff1a;此时&#xff0c;需根据邻接矩阵的特征值来进行区分。例&#xff1a;两个图的邻接矩阵分别为 A , A ′ ∈ R n …

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

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