浅谈单调队列
单调队列,顾名思义就是一个元素之间的关系具有单调性的队列
我们通过一道例题来讲解
最大子序和
题目大意
给定一个长度为
solution
计算“区间和”的问题,一般转化为“两个前缀和相减”的形式进行求解。我们先求出
找出两个位置
使 最大并且 。
首先我们枚举右端点
找到一个左端点
不妨比较一下任意两个位置
如果
那么对于所有大于等于
这是因为不但
以上比较告诉我们,可能成为最优选择的策集合一定是一个
“下标位置递增、对应的前缀和S的值也递增” 的序列。
我们可以用一个队列保存这个序列。随着右端点位置改变,从前向后扫描,我们对每个
- 判断队头决策与
的距离是否超出 的范围,若超出则出队。 - 此时队头就是右端点为
时,左端点 的最优选择。 - 不断删除队尾决策,直到队尾对应的S值小于
。然后把 作为一个新的决策入队。
实现方法:STL双端队列 或 手写(此处只展示了双端队列代码)
deque<int> q;
while(q.size()) q.pop_front();
q.push_back(0);
for(int i=1;i<=n;i++){
while(q.size()&&i-q.front()>k) q.pop_front();
ans=max(ans,sum[i]-sum[q.front()]);
while(q.size()&&sum[q.front()]>=sum[i]) q.pop_back();
q.push_back(i);
}
这就是著名的单调队列算法,因为每个元素至多入队一次、出队一次,所以整个算法的时间复杂度为
它的思想也是 在决策集合(队列)中及时排除一定不是最优解的选择。 单调队列也是优化动态规划的一个重要手段。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!