单调栈
- 在某一序列中,对于某一元素,寻找满足某一条件且距离它左侧(或右侧)最近的某一元素
例子:给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。
输入样例:
5 3 4 2 7 5
输出样例:
-1 3 -1 2 2
一般暴力做法
- 通过for循环进行遍历,找到后退出循环
单调栈做法
- 根据暴力做法,发现一些特性,以此减少运算的次数
特性
- 若ax>=ay,那么ax将永远无法被用到,所以可以删去。
- ai向左扫描时,若ay满足条件,则不可能在扫描到ax了,如果ay不满足条件,则ax更不可能满足条件了
- 同理,对于aj也是相同的
由此产生的方法是:
#include<iostream>
using namespace std;
const int N = 100010;
int n,stk[N],tt;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x;cin>>x;
while(tt&&stk[tt]>=x)tt--;
if(tt)cout<<stk[tt]<<" ";
else cout<<"-1"<<" ";
stk[++tt]=x;
}
return 0;
}