单调队列是一个非常重要的应用
简单的看一下最基本的题目。
有n个数:4 2 1 3 5 6 2 4
你能求出任意连续的k个数最小值吗?那不简单,o(k),打个擂台不就完了,SO EASY
那好,求出每个区间最小值(此区间有k个数,且在n个数中是连续的),行吧?那也简单,o((n-k+1)*k),数据绝度不大,EASY
但是,如果数据范围如此:n<=1000000,k<=10000;
满分绝对没有,o((100000-10000+1)*10000)=o(900010000)=o(9亿),超了6亿多!!
那n=1000000,是十万的一倍,更没可能
难道还有好办法??
当然:看
循环次数 队列 u 输出
1 : 4 1
2 : 2 (2比4小,4出队列) 2
3 : 1 (同上) 3 1(队头)(u>=k,必须输出)
4 : 1 3 4 1
5 : 1 3 5 5 1
6 : 3 5 6 6 3(因为数字1是第三个数,而6-k>=3,不在区间,所以1出队列)
7 : 2 7 2(3不在区间,自动出队列,5,6比2小,出队列)
8 : 2 4 8 2
每个数进队一次,出队一次,所以时间效率为o(2*n),n<=10000000都没问题
我们会发现队列里的数处于递增状态(有时递减),保持一种单调性,所以这是单调队列,在动态规划中有优化时间的作用。下午我将给出程序,继续看在背包类型的动态规划中应用。