单调栈
单调栈的应用场景:
左边离一个数最近 且比它大(小)的数
右边离一个数最近 且比它大(小)的数
题目链接:830. 单调栈 - AcWing题库
题面:
给定一个长度为 𝑁 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式
第一行包含整数 𝑁,表示数列长度。
第二行包含 𝑁 个整数,表示整数数列。
输出格式
共一行,包含 𝑁 个整数,其中第 𝑖 个数表示第 𝑖 个数的左边第一个比它小的数,如果不存在则输出 −1。
数据范围
1≤N≤10^5
1≤数列中元素≤10^9
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
思想:如果栈顶位置的值,比你当前的值还大的话,那肯定对于之后来说就没用了,前边保留的都是比当前位置的值小的数,并且是单增的序列。
代码:
#include<iostream>
#include<stack>
using namespace std;
const int maxn =1e5+5;
int a[maxn];
int st[maxn];
int main(){
stack<int> s;
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int len_st=0;
for(int i=0;i<n;i++){
while(len_st&&st[len_st-1]>=a[i]) len_st--;
if(len_st==0) cout<<-1<<' ';
else cout<<st[len_st-1]<<' ';
st[len_st++]=a[i];
}
return 0;
}
对于样例:
10
11 27 11 6 14 26 8 22 13 7
可以输出一下单调栈:
11
11 27
11
6
6 14
6 14 26
6 8
6 8 22
6 8 13
6 7
//可以发现都是单调增的值,且保留的都是对后面可能有用的值