单调栈和单调队列
对于FIFO队列来说,想以O(1)的复杂度获得其任何时刻的最小值\最大值的话,需要加一个辅助的单调队列
- 最小值:初始值先push入辅助队列,
- 然后如果原队列push进更小的A元素,就将A元素push入辅助队列,把小于A元素值的元素都pop出来
- 然后如果原队列push进更大的A元素,就将A元素push入辅助队列
- 最大值同上,以下是示例
对于FILO的栈来说
最小值:初始值先push入辅助队列,
- 然后如果原队列push进更大的A元素,什么都不做,
就将A元素push入辅助队列 - 然后如果原队列push进更小的A元素,就将A元素push入辅助队列,
把小于A元素值的元素都pop出来
面试题 03.02. 栈的最小值
装第一个值:
- 比deque[-1]大的,不装
- 比deque[-1]小的,装
146. LRU缓存机制
1 | class DLinkedNode: |
59 - II. 队列的最大值
装第一个值:
- 比deque[-1]大的,循环去掉deque[-1],装入
- 比deque[-1]小的,直接装
1 | from collections import deque |
单调队列
判断窗口内的最大值:
1 | from collections import deque |