首页 > 其他分享 >单调栈 & 单调队列

单调栈 & 单调队列

时间:2024-10-07 21:23:50浏览次数:6  
标签:q2 插入 队列 int 例题 单调

单调栈 & 单调队列

单调栈

引入

单调栈是什么?顾名思义,单调栈即满足单调性的栈结构,与单调队列相比,其只在一端进行进出。

过程

插入

将一个元素插入单调栈时,为维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性,并且使弹出的元素最少

伪代码

insert x
while !sta.empty() && sta.top()<x
    sta.pop()
sta.push(x)

单调栈例题

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,a[3000005],b[3000005];
stack <int> s;
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++) cin >> a[i];
	for(int i=n;i>=1;i--)
	{
		while(!s.empty() && a[s.top()] <= a[i]) 
		{
			s.pop();//弹出栈顶比当前数小的
		}
		if(!s.empty())
		{
		    b[i] = s.top();   
		}
		else
		{
		    b[i] = 0;
		}
		s.push(i);
	}
	for(int i = 1;i <= n;i++)
	{
		cout << b[i] << " ";
	}
	return 0;
}

定义也是直接抄OI Wiki

单调队列

引入

首先我们要看一道经典例题,滑动窗口

最暴力的想法很简单,对于每一段 i~i+k-1 的序列,逐个比较来找出最大值(和最小值),时间复杂度约为 O(n * k)。

很显然,这其中进行了大量重复工作,除了开头 k-1 个和结尾 k-1 个数之外,每个数都进行了 k 次比较,而题中 100% 的数据为 n <= 1000000,当 k 稍大的情况下,显然会 TLE。

这时所用到的就是单调队列了。

定义

顾名思义,单调队列的重点分为「单调」和「队列」。

单调 指的是元素的规律递增(或递减)。
队列 指的是元素只能从队头和队尾进行操作。

例题分析

没错,它在这里

代码奉上

//1、维护队首(就是如果你已经是当前的m个之前那你就可以被删了,head++)
//2、在队尾插入(每插入一个就要从队尾开始往前去除冗杂状态)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int q1[1000001],q2[1000001];
int a[1000001];
int min_deque()
{
	int h = 1,t = 0;
	for(int i = 1;i <= n;i++)
	{
		while(h <= t && q1[h] <= i - m) h++;
		while(h <= t && a[i] < a[q1[t]]) t--;
		q1[++t] = i;
		if(i >= m ) cout << a[q1[h]] << " ";
	}  
	cout << "\n";
	return 0;
}
int max_deque()
{
	int h = 1,t = 0;
	for(int i = 1;i <= n;i++)
	{
		while(h <= t && q2[h] <= i - m) h++;
		while(h <=t && a[i] > a[q2[t]]) t--;
		q2[++t] = i;
		if(i >= m) cout << a[q2[h]] << " ";
	}
	return 0;
}
int main()
{
	cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> a[i];
	min_deque();
	max_deque();
	return 0;
}

完结

标签:q2,插入,队列,int,例题,单调
From: https://www.cnblogs.com/Domi2011/p/18450652

相关文章

  • 代码随想录算法训练营 | 56. 合并区间,738.单调递增的数字
    56.合并区间题目链接:56.合并区间文档讲解︰代码随想录(programmercarl.com)视频讲解︰合并区间日期:2024-10-06想法:重叠区间类似问题Java代码如下:classSolution{publicint[][]merge(int[][]intervals){List<int[]>res=newArrayList<>();Arra......
  • 数据结构——栈和队列
    数据结构——栈和队列文章目录数据结构——栈和队列一、栈1.概念2.结构这里我们选择数组作为栈的底层结构。3.栈的实现3.1初始化3.2销毁3.3入数据3.4出数据3.5取栈顶元素3.6获取栈中有效元素个数4.完整代码4.1.Stack.h4.2.Stack.c4.3.test.c二、队列1.概念2.结构这......
  • 消息队列面试01
    基础知识特点:(1)服务解耦:服务之间通过消息中介(如RabbitMQ、Kafka)进行通信,减少直接依赖。(2)异步处理:提高当前请求速度,代价是系统调用的降速,可能带来业务不一致。(3)削峰(流量控制):消息产生速度>消息消费速度(先把请求存起来)(4)增强系统可靠性:     I.MQ给consumerAC......
  • 单调栈
    单调栈是一种内部元素具有单调性的栈,可以解决与“以某个值为最值的最大区间”等问题。例题:P2866[USACO06NOV]BadHairDayS有\(N\(1\leN\le80000)\)头奶牛,第\(i\)头牛的身高为\(h_i\(1\leh_i\le10^9)\)。每只奶牛往右边看,可以看到严格小于它身高的牛的头顶......
  • 代码随想录算法训练营 | 134. 加油站,135. 分发糖果,860.柠檬水找零,406.根据身高重建队
    134.加油站题目链接:134.加油站文档讲解︰代码随想录(programmercarl.com)视频讲解︰加油站日期:2024-10-04想法:1.总汽油大于等于消耗一定能跑完,2.当前剩余汽油小于0了,只能从下一站开始重新计算Java代码如下:classSolution{publicintcanCompleteCircuit(int[]gas,int......
  • [消息队列]kafka高性能/高吞吐量
    Kafka每秒可以处理一百万条以上消息,吞吐量达到每秒百万级。那么Kafka为什么那么高的吞吐量呢?简单来说有以下几点原因:页缓存技术Kafka是基于操作系统的页缓存来实现写入的。操作系统本身有一层缓存,叫做pagecache,是在内存里的缓存,我们也可以称之为oscache,意思就是操作系统自己......
  • python3 队列的使用
    在leetcode如下题目中使用队列637.二叉树的层平均值:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolutio......
  • [JSOI2008] 最大数 (单调栈)
    算法基础发现插入总在最后一个进行单调栈维护一个区间的\(max/min\)单调队列维护以一个值为\(max/min\)的最大区间显然可以使用单调栈维护其原理为当\(a,b\inseq,a<b,pos[a]<pos[b]\)那么显然\(a\)没有卵用因此可以用单调栈维护一个包含\(seq\)的......
  • 单调队列优化 DP
    单调队列可以\(O(n)\)求出子区间的最值,且顺序上要求区间的左端点和右端点单调不降。引入P1886滑动窗口/【模板】单调队列定义一个队列\(q\),我们让\(q\)中的元素满足单调不降。因此当\(x\)入队时,从前往后让不在当前范围的元素出队,从后往前将\(<x\)的元素全部出队,然......
  • 队列实现
    1、数组实现队列#include<stdio.h>#include<stdlib.h>#include<conio.h>#defineMAX10 /*定义队列的大小*/intmain(){ intfront,rear,val,queue[MAX]={0}; charchoice; front=rear=-1; while(rear<MAX-1&&choice!='e') { ......