2026年5月1日预计 2 分钟阅读OI

单调栈

zbl2012
zbl2012博主 & 创作者

单调栈是一种通过维护单调性用 O(n)O(n) 的时间求解前面的数据对后面的数据没有影响的问题。

顾名思义,单调栈其实就是一个栈,手写和 STL 都可以。 写单调栈,首先要确定这个栈是要单调递增还是单调递减。

一个单调栈的模板题:求一个长度为 nn 的序列中每一个数的左边第一个比它小的数,如果没有,则输出 00。其中 n106n\le 10^6。 发现这个题目如果每一次暴力去查找的话,时间复杂度是 O(n2)O(n^2),显然不可以通过。 这个时候就要维护一个单调递增栈,每一次要放入数据时,就判断栈顶是否比该元素大,如果是,则一直弹栈,直到栈顶比该元素小。而此时的栈顶就一定是左边第一个比该元素大的数。最后把该元素入栈即可。 时间复杂度和空间复杂度都是 O(n)O(n)

注意点 1.注意开始遍历数组之前,要往栈里放一个 00。 2.记得在判断栈顶单调性并弹栈时判断栈里面有数。

code

cpp
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int a[N];
int s[N],top;
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	s[++top]=0;
	for(int i=1;i<=n;i++){
		while(top&&a[i]<=s[top])top--;
		cout<<s[top]<<' ';
		s[++top]=a[i];
	}
	return 0;
} 

文章留言区

已有 0 条精彩探讨

正在拼命加载留言中...

发表您的见解

※ 提倡客观理性讨论。留言需要经过安全核查,请勿注入恶意链接。
上一篇文章当前文章已经是首篇啦!
下一篇文章 I am zbl2012