C++单调队列的运用

我们通过一个题目来讲解:

首先有一个讲解一下就是,一般思路就是:1.在第i个数中,前面有m个数,然后一个个求这m个数中子数和的最大值,然后i再往后移动一位,再继续前面的动作。时间复杂度就是o(m * n), 但是单调队列就可以实现o(N)的时间复杂度。但实现之前,还需要灵活一下,是由于这个题目是求前x数列的和,那么我们就可以求s1, s2, s3 , s4,...si, ....sn,如果要求aj ...ai之间的和,就等于si - s(j - 1)就可以了,那么第i个数是定下来的,sj - 1 越小,那和就越大,那么我们不妨存储最小值,然后到第i个就可以直接求出来,就不需要o(m)这一复杂度了,直接变成o(1)了。

那么我们这么维护他呢,看代码,我会一步步的讲解,我学的时候,他们就一下就给出了,想了好久:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值