单调队列与单调栈

单调栈

单调栈,顾名思义,就是维持单调性(递增或者递减)的栈结构,如果新入栈的元素破坏了单调性,就弹出原先栈内元素,直到能够满足单调性

用途:它可以很方便地求出某个数的左边或者右边第一个比它大或者小的元素,而且总时间复杂度o(n),并且单调栈本身并不难实现

维护:每次入栈前先检验入栈后是否会破坏栈的单调性,如果不会,就直接入栈,否则使原栈栈顶元素出栈,直到栈空或者满足要求
操作样例:6 10 3 7 4 12 2 递增
初始状态:空栈
6 入栈:空栈 -> 6
10入栈:6 -> 6,10
3 入栈:6,10 -> 6 -> 空栈 -> 3
7 入栈:3 -> 3,7
4 入栈:3,7 -> 3 -> 3,4
12入栈:3,4 -> 3,4,12
2 入栈:3,4,12 -> 3,4 -> 3 -> 空栈 ->2
代码:

for(j=0;j<t;j++)
{
    scanf("%d",&m);
    while(len&&m>=s[len-1])--len;
    s[len++]=m;
}

相关题目传送门:
POJ 3250:http://blog.csdn.net/silence__bug/article/details/46882209

单调队列

与单调栈相似,单调队列就是维持单调性的队列,加入新元素时同样需要维持其单调性,其方式也类似

用途:对于维护好的单调队列,对内元素是有序的,那么取出最大值(最小值)的复杂度是o(1)

维护:与单调栈的方式相似,但是不仅可以从队尾出栈(用于维持其单调性),也可以从队首出栈(其他限制条件),因此其实现比单调栈复杂一些
操作样例1:1 3 -1 -3 5 3 6 7 求每连续三个数的最大值和最小值
初始状态:1,3
-1入栈:-1,1,3 获取最大值3,最小值-1(先出栈,后入栈)
1出队-3入队:-1,1,3 -> -1,3->-3,-1,3 获取最大值3,最小值-3
3出队5入队:-3,-1,3 -> -3,-1 ->-3,-1,5 获取最大值5,最小值-3
-1出队3入队:-3,-1,5 -> -3,5 -> -3,3,5 获取最大值5,最小值-3
-3出队6入队:-3,3,5 -> 3,5 ->3,5,6 获取最大值6,最小值3
5出队7入队:3,5,6 -> 3,6 -> 3,6,7 获取最大值7,最小值5
操作样例2:1 3 -1 -3 5 3 6 7 求每连续三个数的最大值
初始状态:1 -> 空 -> 3
-1入栈:3 -> 3,-1获取最大值3(先出队,后入队)
1出队-3入队:3,-1 ->3,-1,-3 获取最大值3
3出队5入队:3,-1,-3 -> 空 -> 5 获取最大值5
-1出队3入队:5 -> 5,3 获取最大值5
-3出队6入队:5 -> 空 -> 6 获取最大值6
5出队7入队:6 -> 空 -> 7 获取最大值7

实际代码有点复杂,详见相关题目题解,传送门

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值