贡献者: 有机物
单调队列和单调栈类似,内部的元素都是单调递增或者递减的,单调队列的思想也是及时排除一定不是最优的选择。单调队列的时间复杂度也是
单调队列通常处理滑动窗口类的问题,例题。
题意大致为:有一个大小为
举例:
该数组为 [1 3 -1 -3 5 3 6 7]
,
窗口位置 | 最小值 | 最大值 |
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
同样,我们来思考一下朴素算法怎么做,我们用一个队列(这里的队列指双端队列,两端都可以弹出元素)来维护窗口,每次往后移动一位就是往队尾插入一个数,队头删除一个数。要移动
如何去优化?思想和单调栈类似,如果
具体做法:每次加入一个元素之前判断元素队尾元素是不是比要插入的元素大或相等,如果满足的话删除队尾元素,所以求最小值直接输出队头元素。
友情链接: 超理论坛 | ©小时科技 保留一切权利