单调栈、双端队列、单调队列

来源:互联网 发布:nao机器人python开发 编辑:程序博客网 时间:2024/04/27 11:27

它们分别是栈和队列的变形,在某些时候会具有极大地价值。

单调栈

之所以被称作单调栈 是因为栈里面的元素是单调的。即,从栈顶到栈底是严格单调递增或递减的。
想要构成单调栈,对于入栈操作就需要作出一定的限制。
这里以单调递增栈为例进行说明:新增一个元素 需要将比他小的元素都出栈后才能加入。
例如 某次需要加入栈的元素依次为: 3 4 8 1 6 4 5 9
3进栈 (3)
3出栈 4进栈 (4)
4出栈 8进栈 (8)
1进栈(8 1)
1出栈 6进栈(8 6)
4进栈 (8 6 4)
4出栈 5进栈(8 6 5)
5 6 8出栈 9入栈 (9)

关于单调栈的一道简单题
如下:

地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,如下图所示。我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板,现对每块木板依次做如下的操作:对于第 i 块木板,我们从其右侧开始倒水,直到水的高度等于第 i 块木板的高度,倒入的水会淹没 ai 块木板(如果木板左右两侧水的高度大于等于木板高度即视为木板被淹没),求 n 次操作后,所有 ai 的和是多少。如下图所示,在第 4 块木板右侧倒水,可以淹没第 5 块和第 6 块一共 2 块木板,a4 = 2。

这里写图片描述

如果暴力找右边第一个比他大的木板,无疑是O(n^2)

如果用单调栈优化 复杂度仅仅O(n)

假设有八块木板 分别为 3 4 8 1 6 4 5 9

那么 为上面的样例 加一些卫星数据即可算出答案

3进栈 (3)
3出栈 4进栈 (4)————出栈的3是第1块木板 所以第1块木板淹没 0=2-1-1;
4出栈 8进栈 (8)————出栈的4是第2块木板 所以第2块木板淹没 0=3-2-1;
1进栈(8 1) ————无出栈
1出栈 6进栈(8 6)————出栈的1是第4块木板 所以第4块木板淹没 0=5-4-1;
4进栈 (8 6 4)————无出栈
4出栈 5进栈(8 6 5)————出栈的4是第6块木板 所以第6块木板淹没 0=7-6-1;
5 6 8出栈 9入栈 (9)————出栈的5,6,8分别是是第7,5,3块木板 所以第7,5,3块木板淹没 0=8-7-1;2=8-5-1;4=8-3-1

最后插入一块无穷大的木板清空栈
9 出栈 0=9-8-1;

求和 可得 6

双端队列

双端队列(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
双端队列是限定插入和删除操作在表的两端进行的线性表。在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。

单调队列

单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足最优性问题的需求。
单调队列,又名双端队列。双端队列,就是说它不同于一般的队列只能在队首删除、队尾插入,它能够在队首、队尾同时进行删除。

例如 某次需要加入单调队列(最大)的元素依次为: 3 4 8 1 6 4 5 9

注:出栈意为从队尾出去

3进队 (3)
3出栈 4进队 (4)
4出栈 8进队 (8)
1进队(8 1)
1出栈 6进队(8 6)
4进队 (8 6 4)
4出栈 5进队(8 6 5)
5 6 8出栈 9入队 (9)

入眼一看似乎和单调栈一样,其实出现这样的原因是:出队操作没有利用上,而出对操作的利用其实是有具体的意义。
所以不难推断,单调队列是 单调栈的加强

我们可以通过一道题来理解单调队列

关于单调队列的一道简单题

用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值

假设有八个数 分别为 3 4 8 1 6 4 5 9 k=3

我们需要一个二元组(x,y) 其中x 代表数字值, y 代表下标 ;例如 (4,2)代表 下标为2的那个4

我们以数字值建立单调队列

(3,1)
(4,2)
(8,3)……………………………….1-3最大值为8
(8,3) (1,4)………………………2-4个最大值为8
(8,3) (6,5)………………………3-5个最大值为8
(6,5) (4,6)………………………4-6个最大值为6 //8之所以出队是因为3小于4=6-3+1
(6,5) (5,7)………………………5-7个最大值为6
(9,8)……………………………….6-8个最大值为9

原创粉丝点击