单调栈与单调队列
单调栈与单调队列优化原理
单调栈与单调队列的优化原理就是维护一个动态的数据结构,来避免每次都要从第i个元素重新开始。
比如,我们有一个数组A,我们要求
如果不使用单调栈的话。我们每次求
但是我们维护了一个动态的单调栈,它是与i独立的。我们不需要每次都从Ai开始,而是从单调栈
最后指向的元素开始。这意味着我们只需要遍历一遍整个数组,时间复杂度为O(n),这样就极大的压缩了时间复杂度。
单调栈
单调栈是栈中数据具有单调性的一种数据结构,用来求以某个值为最值的最大区间等问题
洛谷模板题:单调栈
模板(c++):
int n,in;
int sk[1010];
int top;
func(){
for(int i=0;i<n;i++){
scanf("%d",&in);
while(top>0&&in>=stack[top])--top;//>=就是从栈底到栈顶单增
/*加入自己需要的功能*/
sk[++top]=in;
}
}
单调队列
也许是单调栈plus?
从队首到队尾的数据是单调的,解决区间内最值问题等问题
模板(c++):
#include<iostream>
#include<deque>
using namespace std;
deque<int>que;//该模板的que只储存下标,要根据需要修改
int n,m;
int in[2000005];
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&in[i]);
}
for (int j = 1; j <= m; j++) {
while (que.size() > 0 && que.front() <= j - k) {//更新区间
que.pop_front();
}
while (que.size() > 0 && in[i][que.back()] < in[i][j]) {//控制队列的单调性
que.pop_back();
}
que.push_back(j);//将当前下标加入队列
/*加入功能*/
}
return 0;
}
本文来自博客园,作者:{bvwvd},转载请注明原文链接:{https://www.cnblogs.com/bvwvd/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】