算法之单调栈与单调队列

单调队列

单调队列顾名思义就是具有单一单调性的队列。

例题

给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数。
数列长度:N<=106,m<=N

数列为:6 4 10 10 8 6 4 2 12 14,求长度为3的数列段内的最大数,使用单调递减栈。
(1)(6,0)入队,此时队列为(6,0)
(2)(4,1)入队,此时队列为(6,0) (4,1)
(3)(10,2)入队,需要递减,那么(4,1) (6,0)需要出队,此时队列为(10,2)
(4)(10,3)入队,需要递减,那么(10,2)需要出队,此时队列为(10,3)
(5)(8,4)入队,此时队列为(10,3) (8,4)
(6)(6,5)入队,此时队列为(10,3) (8,4) (6,5)
(7)(4,6)入队,超长(10,3)出队,此时队列为(8,4) (6,5) (4,6)
(8)(2,7)入队,超长(8,4)出队,此时队列为(6,5) (4,6) (2,7)
(9)(12,8)入队,需要递减,那么(6,5) (4,6) (2,7)需要出队,此时队列为(12,8)
(9)(14,9)入队,需要递减,那么(12,8)需要出队,此时队列为(14,9)

对于每次的输出,就是队列头部的值,分别为:
6 6 10 10 10 10 8 6 12 14(注意开始时的最值)
最大值:队列单调递减,队头就是需要的最大值。
最小值:队列单调递增,队头就是需要的最小值。

单调栈

单调栈顾名思义就是具有单一单调性的栈,在栈顶操作。

例题

柱形图中的最大矩形面积。https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
在这里插入图片描述
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
在这里插入图片描述
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

输入: [2,1,5,6,2,3]
输出: 10

该题使用单调栈,辅助一个宽度表width,模拟如下:
(1)2入栈,width[top++] = 1,栈内元素2width={1}
(2)1即将入栈,1<2,2出栈,curWidth+=width[--top]==1,res = max(res , 2 * curWidth) == 2,1入栈,width[top++] = curWidth + 1 == 2,栈内元素1width={2}
(3)5>1,5入栈,width[top++] = 1,栈内元素1 5top=2width={2,1}
(4)6>5,6入栈,width[top++] = 1,栈内元素1 5 6top=3width={2,1,1}
(5)2即将入栈,2<6,6出栈,curWidth+=width[--top] == 1,res = max(2 , 6 * curWidth) == 6width={2,1}
2<5,5出栈,curWidth+=width[--top] == 2,res = max(6 , 5 * curWidth) == 10width={2}
;2入栈,width[top++] = curWidth + 1 == 3,栈内元素1 2width={2,3}
(8)3入栈,width[top++] = 1,栈内元素1 2 3width={2,3,1}
(8)数据为空,栈不为空,弹栈算栈内的数据。
(9)3出栈,curWidth+=width[--top] == 1,res = max(10 , 3 * curWidth) == 10width={2,3}
(10)2出栈,curWidth+=width[--top] == 4,res = max(10 , 2 * curWidth) == 10width={2}
(11)1出栈,curWidth+=width[--top] == 5,res = max(10 , 1 * curWidth) == 10width={}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值