依据
单调栈具有贼有趣的实现方式:
在查找的同时,删除多余的,插入新的
那么删除插入的过程和依据呢?
我是nums[i]
,以找出左边第一个比我小的元素为例:
栈里的元素是非降序的,而且都在我左边
凡是栈里比我大的数(记为big
),对找出左边第一个比我小的数来说,无效,可删
对我右边的数来说,big
也是对他们无效的(对他们来说我更近,还比big
更小),也可删
执行删除
找到比我小的数记为small
,可以把small
这样那样做若干处理
我的左边第一个比我小的元素找好了,我加入栈顶
轮到nums
里下一个开始找,从栈顶开始,凡是比他大的数,可删...
模板1-数组存储后再遍历
#include <iostream>
using namespace std;
const int N = 100050;
int a[N],q[N];
int main(){
int n,tt=0;
cin>>n;
for(int i=0;i<n;i++ ){
cin>>a[i];
}
for(int i=0;i<n;i++ ){
while(tt>0 && q[tt]>=a[i]) tt--;
if(tt==0) cout<<"-1"<<" ";
else cout<<q[tt]<<" ";
q[++tt]=a[i];
}
return 0;
模板2-单变量读入不存储
#include <iostream>
using namespace std;
const int N = 100010;
int stk[N], tt;
int main()
{
int n;
cin >> n;
while (n -- ){
int x;
scanf("%d", &x);
while (tt && stk[tt] >= x) tt -- ;
if (!tt) printf("-1 ");
else printf("%d ", stk[tt]);
stk[ ++ tt] = x;
}
return 0;
}
标签:int,big,tt,stk,--,单调
From: https://www.cnblogs.com/aijisjtu/p/18112726