单调栈

article/2025/9/30 22:43:44

定义:

	单调栈,顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。

单调递增栈:

①在一个队列中针对每一个元素从它右边寻找第一个比它小的元素

②在一个队列中针对每一个元素从它左边寻找第一个比它小的元素

单调递减栈:

①在一个队列中针对每一个元素从它右边寻找第一个比它大的元素

②在一个队列中针对每一个元素从它左边寻找第一个比它大的元素

单调栈何时用:为任意一个元素找左边和右边第一个比自己大/小的位置用单调栈.

由于每个元素最多各自进出栈一次,复杂度是O(n).

单调递增栈用于找到当前元素左边第一个小于它的的元素

单调递增栈模板:

#include<iostream>
#include<stack>
using namespace std;
int main()
{int n;cin>>n;stack<int>st;for(int i=1;i<=n;i++){int x;cin>>x;while(!st.empty()&&st.top()>x)st.pop();cout<<(st.empty()?-1:st.top())<<endl;st.push(x);}return 0;} 

POJ - 2559    直方图中最大的矩形

直方图是由在公共基线处对齐的一系列矩形组成的多边形。

矩形具有相等的宽度,但可以具有不同的高度。

例如,图例左侧显示了由高度为 2,1,4,5,1,3,32,1,4,5,1,3,3 的矩形组成的直方图,矩形的宽度都为 11:

通常,直方图用于表示离散分布,例如,文本中字符的频率。

现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。

图例右图显示了所描绘直方图的最大对齐矩形。

输入格式

输入包含几个测试用例。

每个测试用例占据一行,用以描述一个直方图,并以整数 nn 开始,表示组成直方图的矩形数目。

然后跟随 n 个整数 h1,…,hn。

这些数字以从左到右的顺序表示直方图的各个矩形的高度。

每个矩形的宽度为 1。

同行数字用空格隔开。

当输入用例为 n=0 时,结束输入,且该用例不用考虑。

输出格式

对于每一个测试用例,输出一个整数,代表指定直方图中最大矩形的区域面积。

每个数据占一行。

请注意,此矩形必须在公共基线处对齐。

数据范围

1≤n≤100000,
0≤hi≤1000000000

输入样例:

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

输出样例:

8
4000

#include<iostream>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int n;
int l[N],r[N];
typedef pair<int,int>P;
P p[N];
int main()
{while(cin>>n&&n){stack<P>st;for(int i=1;i<=n;i++){int x,ind;cin>>x;p[i].first=x;  p[i].second=i;ind=i-1;while(!st.empty()&&st.top().first>=p[i].first)st.pop(),ind--;
//			cout<<(st.empty()?-1:st.top())<<" ";if(st.empty())l[i]=-1;else {P pp=st.top();l[i]=pp.second;}st.push(p[i]);}while(!st.empty())st.pop();for(int i=n;i>=1;i--){int ind;ind=i+1;while(!st.empty()&&st.top().first>=p[i].first)st.pop(),ind++;if(st.empty())r[i]=-1;else{P pr=st.top();r[i]=pr.second;}st.push(p[i]);}long long maxx=-1;for(int i=1;i<=n;i++){int ll,rr;if(l[i]==-1)ll=0;else ll=l[i];if(r[i]==-1)rr=n+1;else rr=r[i];maxx=max(maxx,(long long)(abs(ll-rr)-1)*p[i].first);}cout<<maxx<<endl;}return 0;} 

输入输出样例

输入 #1复制

5
1 4 2 3 5

输出 #1复制

2 5 4 5 0

 题解一:

#include<iostream>
#include<stack>
using namespace std;
const int N=3e6+10;
int a[N];
int ans[N];stack<int>st;
int main()
{int n;cin>>n;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=n;i>=1;i--){while(!st.empty()&&a[st.top()]<=a[i])st.pop();//应该是小于等于,而不是小于
//		cout<<(st.empty()?0:st.top().ind)<<" ";ans[i]=(st.empty()?0:st.top());st.push(i);}for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');return 0;} 

题解二:

#include<iostream>
#include<stack>
using namespace std;
const int N=3e6+10;
struct A{int ind,val;
}a[N];
int ans[N];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++)scanf("%d",&a[i].val),a[i].ind=i;stack<A>st;for(int i=n;i>=1;i--){while(!st.empty()&&st.top().val<=a[i].val)st.pop();//注意应该是小于等于
//		cout<<(st.empty()?0:st.top().ind)<<" ";ans[l++]=(st.empty()?0:st.top().ind);st.push(a[i]);}for(int i=l-1;i>=1;i--)printf("%d%c",ans[i],i==1?'\n':' ');return 0;} 

这题数据量较大,输入用cin会超时,再者找第一个大于它的数,所以用单调递减栈,只要栈顶元素小于等于入栈元素,就出栈。

接雨水

 思路:

用单调递减栈,找到左边第一个比自己高的柱子。

 每当栈顶元素小于入栈元素时,将栈顶元素出栈(记作cur),然后比较此时的栈顶元素和入栈元素的大小,用小的那个减去cur就是雨水的深度,然后用下标计算出宽度,最后深度×宽度得接水量。(实现依据:单调栈里的元素具有单调性)


http://chatgpt.dhexx.cn/article/hcFLS91D.shtml

相关文章

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义&#xff0c;就是栈内的元素是单调的。根据栈内元素的单调性的不同&#xff0c;可以分为&#xff1a; 单调递增栈&#xff1a;栈内元素是单…

【算法】单调栈

目录 单调栈的定义&#xff1a;伪代码&#xff1a;应用1.模板题2.视野总和问题3.柱状图中的最大矩形4.最大区间 碎碎念&#xff1a; 单调栈的定义&#xff1a; 从名字上就能猜出来&#xff0c;这种数据结构在栈的基础上&#xff0c;栈内的元素是单调有序的&#xff0c;所以单调…

单调栈详解

定义&#xff1a; 单调栈&#xff0c;顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。 适用问题&#xff1a; 要知道单调栈的适用于解决什么样的问题&#xff0c;我们首先需要知道单调栈的作用。单调栈分为单调递增栈和单调递减栈&#xff0c;通过使用单调栈我们可以访…

[数据结构]——单调栈

单调栈 笔者在做leetcode的题(下一个出现的最大数字)时&#xff0c;接触到了单调栈这一种数据结构&#xff0c;经过研究之后&#xff0c;发现单调栈在解决某些问题时出奇的好用&#xff0c;下面是对单调栈的性质和一些典型题目。 什么是单调栈&#xff1f; 从名字上就听的出…

scp出现错误的解决办法

scp往远程主机上传送rmandata时报了如下错误&#xff1a; (看不见的放大) 我的做法是&#xff1a; 在执行scp的主机提示的scp目录 vi ~/.ssh/known_hosts 删除我红色部分遮盖的主机ip那一行&#xff0c;故障解决 来自 “ ITPUB博客 ” &#xff0c;链接&#xff1a;http://blo…

关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/110680001 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

VS发生RC1107错误的原因

最近MFC程序中&#xff0c;用VS的资源编辑打开时&#xff0c;老是发生 fatal error RC1107: invalid usage; use RC /? for Help 这种错误&#xff0c;记得前几天解决过一次&#xff0c;但是当时忘了怎么解决的了。今天每建一个新的工程都遇到这个问题&#xff0c;郁闷坏了&a…

错误 LINK : fatal error LNK1158: 无法运行“rc.exe”

2019独角兽企业重金招聘Python工程师标准>>> 问题 软件环境&#xff1a;Windows 10 Pro Visual Studio 2015 然后安装了 Windows 10 SDK Windows 10 SDK 是用这个 ISO 文件安装的&#xff1a;17134.12.180419-0858.rs4_release_svc_prod2_WindowsSDK.iso 在 Visual…

[rtsp @ 0x55ba1dae9200] UDP timeout, retrying with TCP的解决办法

使用ffmpeg 进行解码rtsp的时候出现: [rtsp @ 0x55ba1dae9200] UDP timeout, retrying with TCP如下所示: 需要使用接口指定以下tcp连接就可以解决了。 具体的代码如下: // rtsp:tcpAVDictionary* options = NULL;av_dict_set(&options, "rtsp_transport", …

brpc源码解析(二)—— brpc收到请求的处理过程

文章目录 一、基本设计思路二、实现细节三、总结 作为rpc服务器&#xff0c;在启动过后&#xff0c;最主要的一个过程就是收到请求后的处理&#xff0c;而这就牵涉到一个网络编程相关最基本的部分&#xff1a;如何有效地处理socket传过来地数据&#xff0c;这篇文章就来详细聊一…

libpng warning iCCP 错误处理方法

png图片缺乏某些库&#xff0c;导致损坏&#xff0c;或者多余了一些数据会导致以下报错&#xff1a; libpng warning: iCCP: known incorrect sRGB profile libpng warning iccp extra compressed data一些可能的解决方案&#xff1a; 已有方案 来自&#xff1a;https://blo…

创建线程提示SCB_CFSR_BFSR:0x04 IMPRECISERR 错误

在RTthread的编程出现了问题 这种问题并不是系统出现的问题&#xff0c;而是在处理自己的函数内部出现了数组越界&#xff0c;内存出现错误导致的。 关键还是自己指针访问的非法访问导致这些问题。遇到问题还是要多检查自己写的接口问题。

无法运行rc.exe(已解决)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言原因解决一&#xff1a;在C:\Program Files (x86)下搜索rc.exe二&#xff1a;右击&#xff0c;打开找到的rc.exe的文件夹然后进入Visual Studio 2019 前言 解决…

RTCP(一): RR--Receiver Reports 接收者报告

RTCP RR的格式 接受者报告的RTCP类型是201&#xff0c;如图1.1所示。 图1.1 reporter ssrc rr报告发送者的ssrc&#xff0c;也就是rtp报文接受者自己的ssrc. reportee ssrc rr报告接受者的ssrc&#xff0c;也就是rtp报文发送者的ssrc. cumulative number of packet lo…

MFC生成错误msado15.tlh(3991):fatal error C1003: 错误计数超过100;正在停止编译

MFC生成过程产生错误msado15.tlh(3991): fatal error C1003: 错误计数超过 100&#xff1b;正在停止编译 1 问题描述 在MFC生成解决方案过程中&#xff0c;当点击工具栏的生成按钮时&#xff0c; 会出现编译错误的情况&#xff1a; msado15.tlh(3991): fatal error C1003: 错…

webrtc编译中的错误解决

webrtc编译记录 错误1&#xff1a;该错误的意思是python的安装路径要和你此时的webrtc源码的编译路径相同。 解决方法&#xff1a;将python的安装路径和webrtc编译源码的路径放在同一个磁盘下。 错误2&#xff1a;Windows 默认不支持文件名或目录名长于260个字符的&#xff…

rvtptcontrol failed

rvtptcontrol failed RVT00-010:子例行程序 rvtooperation()返回错误。 原因&#xff1a;子例行程序 rvtooperation() 返回内部错误。返回的错误信息为&#xff1a; 措施&#xff1a; 请记下此错误编号以及无法读取例程 &routine 中配置文件选项 INV_DEBUG_TRACE 的值”这…

error C2338: /RTCc rejects conformant code错误解决

在编译一个项目时&#xff0c;发现在调试版本时提示这个出错&#xff1a; 1>------ 已启动生成: 项目: simulation2, 配置: Debug Win32 ------1>precompiled.cpp1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\yvals.h(112): error C2338: /RTC…

CSHOP后台设置SMTP发邮件提示 Error: need RCPT command 错误解决

其实错误原因并不是因为此错误&#xff0c;经检测&#xff0c;邮件服务器返回的真实错误是 501 mail from address must be same as authorization user 。只因为同时返回了 503 Error: need MAIL command 和 503 Error: need RCPT command &#xff0c;而ECSHOP只提示了最后一…

阿里云企业邮箱代理商:foxmal邮件发送RCPT错误怎么办?

阿里云企业邮箱代理商&#xff1a;foxmal邮件发送RCPT错误怎么办&#xff1f; 聚搜云是上海聚搜信息技术有限公司旗下品牌&#xff0c;坐落于魔都上海&#xff0c;服务于全球、2019年成为阿里云代理商生态合作伙伴。与阿里云代理商、腾讯云、西部数码、美橙互联、聚搜云,长期战…