队列是一种先进先出的数据结构。
有一些题目我们需要先推导它们的性质,然后根据其性质使用队列。这种题目的难度往往较大。
单调队列问题
单调队列顾名思义,和单调栈一样,保存一堆单调递增的数据。不同的是,单调队列需要从最前面的元素开始操作,单调栈需要从最后面的元素进行操作。
最大子序和(经典题型)
题目让求连续的序列和,多半要用到前缀和。使用前缀和,问题就转化成了对于位置i,求出最小前缀和S[j],j属于[i - m, i - 1]。
我们先用一个数据结构保存[i - m, i - 1]的元素,观察有哪些性质。对于一个位置k,如果存在m < k且S[m] > S[k],那么S[m]就永远不会被用到,可以被删去。因为对于i右边的位置,会优先用比S[m]小的S[k],更何况m还小于k。这就是单调队列的由来。
结合单调栈的题型,我们发现两个问题有所关联。单调栈的问题是让求出在某个区间里第一个比a[i]小的元素,单调队列是让求出在某个区间里最小的元素。