【真香笔记இ௰இ】单调栈和单调队列

文章开头第一句:回家旅游一时爽,集训补课火葬场啊 。

单调栈和单调队列

是什么:顾名思义,单调递增或递减的栈和队列
为什么:维护区间最值,去除冗杂
怎么弄:在普通栈和队列的基本操作(入栈出栈入队出队等)上,

1、单调队列:

单调递增队列可以维护最小值,就以单调递增队列为例。
例:Poj 2823 给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数。
案例数据:6 4 10 10 8 6 4 2 12 14 16 其中m=3;
解:m=3则设置一个长度为3的单调队列
从头扫一次数据,依次进队,必须保持队列的单调递增性,如果新入队的元素比队首小,即破坏了单调性就清空队列后再放进去,下面为队列实时情况:
扫第一个数据为6,队列:6
第二个数据为4,比6小,破坏单调递增性,清空后再入队:4
第三个为10:4,10
第四个为10,与队尾相等,保留一个即可:4,10
第五个为8:8
第六个为6:6
第七个为4:4
第八个为2:2
第九个为12:2,12
第十个为14:2,12,14
第十一个为16,队列已满,踢掉队首:12,14,16
扫描结束,那么这个数列中每个长度为m的最小数分别为从第m次扫描开始,当过队首元素的元素:6,4 ,4,4,8,6,4,2,2,2,12
同理,单调递减队列可以维护最大值

总了个结:

  1. 单调队列可以维护队首
  2. 操作时,与队尾相同的元素只保留一个即可
  3. 破坏单调性的清空队列后再入队
  4. 入队时队列已满则把队首踢掉
  5. 所有元素入队结束后,当过队首元素的都是最值
2、单调栈:

单调栈可以寻找每个元素后面(按扫描顺序分先后)第一个比他大或小的数。单调递减栈(栈顶最小为单调递减)可以寻找后面第一个比他大的数,以此为例。
例:
在这里插入图片描述
案例数据:n=6 模板长度10,5,8,12,6,∞
栈为防溢出,不设置长度。
开始扫描,下面是栈内情况:
第一个元素10,入栈:10
第二个元素5:10,5
第三个元素8,破坏单调递减性,结算栈顶并将其弹出直至满足单调性后再入栈:10,8
第四个元素12,破坏单调性,结算直至满足单调性后入栈:12
第五个元素6:12,6
第六个元素∞,即将所有元素全部结算:∞

总了个结:

  1. 单调栈可以找每个数据出后面第一个比他大/小的元素
  2. 此题中,与栈顶相同的元素任然可以入栈,一般看题意决定
  3. 破坏单调性的元素依次将栈顶结算,直至符合单调性后入栈
  4. 一般不设置栈的长度,防止溢出
  5. 操作完成每个元素也都结算完成

说白了处理题目就是人为将自然语言转化为机器语言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值