单调队列

单调队列是一个非常重要的应用微笑

简单的看一下最基本的题目。

有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都没问题

我们会发现队列里的数处于递增状态(有时递减),保持一种单调性,所以这是单调队列,在动态规划中有优化时间的作用。下午我将给出程序,继续看在背包类型的动态规划中应用大笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值