单调栈与单调队列
单调栈与单调队列一般存在以下三种形式:存值,存下标,数组实现,数组实现的优点在于在清空栈时只需top=0即可
单调栈
伪代码:
1 | for(i=1->n)//n为元素数量 |
eg:输入n个数字 输出每个数字左侧距离该数字最近的比它小的元素,不存在则输出-1
in 5
7 8 5 6 7
out -1 7 -1 5 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//存值
int a[N],ans[N];//a[N]用来存放输入的数字,ans[N]用于存放答案
stack<int> stk;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
while(stk.size()&&stk.top>=a[i])stk.pop();
if(stk.empty())ans[i]=-1;
else ans[i]=stk.top();
stk.push(a[i]);
cout<<ans[i]<<' ';
}
//存下标+数组实现
int a[N],stk[N],ans[N],top;//stk数组用来模拟下标
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
while(top&&a[stk[top]]>=a[i])top--;
if(top) ans[i]=a[stk[top]];
else ans[i]=-1;
stk[++top]=i;
cout<<ans[i]<<' ';
}
1 | //存值 |
单调队列
通过deque实现,在队头进行出队操作,在队尾进行入队和出队操作,最典型的是用于处理滑动窗口
伪代码:
1 | for(i=1->n) |
1 | //deque存下标实现 |
#TODO 数组模拟
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LoneWolfC7的博客!
评论







