单调队列+STL deque

  • Post author:
  • Post category:其他




单调队列=双端队列!

我们从最简单的问题开始:

给定一个长度为N的整数数列a(i),i=0,1,…,N-1和窗长度k.

要求:

f(i) = max{a(i-k+1),a(i-k+2),…, a(i)},i = 0,1,…,N-1

问题的另一种描述就是用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值。

解法一:

很直观的一种解法,那就是从数列的开头,将窗放上去,然后找到这最开始的k个数的最大值,然后窗最后移一个单元,继续找到k个数中的最大值。

这种方法每求一个f(i),都要进行k-1次的比较,复杂度为O(N*k)。

那么有没有更快一点的算法呢?

解法二:

我们知道,上一种算法有一个地方是重复比较了,就是在找当前的f(i)的时候,i的前面k-1个数其它在算f(i-1)的时候我们就比较过了。那么我们能不能保存上一次的结果呢?当然主要是i的前k-1个数中的最大值了。答案是可以,这就要用到单调递减队列。

单调递减队列是这么一个队列,它的头元素一直是队列当中的最大值,而且队列中的值是按照递减的顺序排列的。我们可以从队列的末尾插入一个元素,可以从队列的两端删除元素。



1.首先看插入元素:为



版权声明:本文为leolin_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。