单调栈与单调队列

单调栈与单调队列优化原理

单调栈与单调队列的优化原理就是维护一个动态的数据结构,来避免每次都要从第i个元素重新开始。

比如,我们有一个数组A,我们要求Ai的后面有多少个数据比 Ai小。
如果不使用单调栈的话。我们每次求Ai后面有多少数据,都要从Ai开始。这意味着时间复杂度最坏为O(n!),很容易超时。
但是我们维护了一个动态的单调栈,它是与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;
}
posted @   bvwvd  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示