队列与单调队列:求解滑动窗口求最大值

94 阅读2分钟

如题

[6 4 2] 10 3 8 5 9 -> 6
6 [4 2 10] 3 8 5 9 -> 10
6 4 [2 10 3] 8 5 9 -> 10
6 4 2 [10 3 8] 5 9 -> 10
6 4 2 10 [3 8 5] 9 -> 8
6 4 2 10 3 [8 5 9] -> 9

窗口内的队列-不单调,那么求解的时间复杂度将会是O(nm),其中n为数组长度,m为窗口队列长度。

有没有一种方法,让求解的时间复杂度降为O(n) 有的!单调队列,维护在队列处理顺序中的区间最大值;

单调队列

image.png

既然是单调队列,那就让我们一起来维护这个数据结构性质,所以:

  • step1:判断“红”同学入列是否影响队列的单调性,若“红”同学大于“蓝”同学,就需要先剔除“蓝”同学;
  • step2:“红”同学入列;
  • step3:判断队列是否满员,队尾有1人入列,队首就需要有1人出列;
  • step4:判断是否满足滑动窗口提前所需元素,报告输出当前滑动窗口的最大值;

使用场景

“单调队列”强调一个队列处理顺序,如果你可以把一个问题转化为求解顺序,抽象成队列求解顺序, 并且在这个过程中,你还需要维护区间最大值,那么就翻出“单调队列”准能帮助你大幅度提升处理速度。

  • 时间复杂度:O(n)

参考文献

  1. 此文章为2月Day1学习笔记,内容来源于极客时间《人人都能学会的编程入门课》

最后

文中若有我没说清楚或错误的地方

欢迎v我yxdiet,备注下是掘金的小伙伴!

反手赞一个叭!对我是莫大的鼓励 💗