单调队列是在单调栈上的拓展,单调队列中元素单调。注意与优先级队列进行区分。

单调队列的性质:

  • 寻找最大最小值时间复杂度小于 O(n),但大于 O(1),可以起到优化时间复杂度的作用
  • 单调队列初始时没有元素需要添加元素,以后每次变动队列不可能存在空的情况,只有在初始时添加第一个元素时候为空
  • 单调队列首尾变动,中间元素不变动
  • 单调队列第一个值必定是原序列中的最值,最后一个值不一定是原序列中的最值
题型

一个序列只有头尾的数据有变动,需要求该序列的最大值或最小值,可以尝试使用单调队列

时间复杂度是小于 O(n) 的,因此可以用来优化程序

常见题型:划窗类型题

关键字

头尾变动, 求最大或最小

解题步骤

注意观察题型满足首位元素变动,求最大或最小,希望优化时间小于 O(n) 的题目,我们就可以尝试使用单调队列去解决。

单调队列每次最值都在最左边,因此维护单调队列的时间复杂度小于 O(n) 线性,但也绝不是 O(1),找到最值的时间复杂度为 O(1),因为单调队列的第一个元素就是最值

  • 1.队首(左边)判定元素是否出队

    由于单调队列左边必定是最大值(最小值),根据题目要求判定单调队列左边是否要出队

  • 2.队尾(右边)通过循环不断删除结点

    右边通过一个 while 循环不断删除队尾元素,来保证较大(较小)的元素成功在右边入队,以此来维护单调队列

  • 3.最右边新元素入队

    当最右边元素入队之后,就成功维护一个新的单调队列