当前位置: 首页 > news >正文

单调队列/滑动窗口模板

例题参考洛谷P1886

问题简述:

一个数组,有一个滑动窗口,每一次滑动一个格子,求每次窗口内的最大值和最小值。

分析:

暴力要O(n^2)的复杂度,肯定会超时,这里会思考如何用空间换时间。
以最小值为例子,可以想到用一个数组维护最小值,扫数组一边就可以,如何实现呢?

这里可以用单调队列。
特性:存的是所有可能成为最小值的值的下标。队首是最小值的下标,单调递增(后面的数也有可能成为最小值)

为什么存下标?
因为需要解决两个问题:最小,在窗口内。
读取的原来的数组a存值,可以用来解决第一个问题,第二个问题就需要再写个存下标的数组

实现:

使用双端队列

  1. 每次去除队首过期的元素。
  2. 每次判断新元素和队尾元素的大小关系,如果比队尾的小,就弹走(它不可能成为最小值了,因为有一个比他又新又小的数出现了)
  3. 队首就是每一个窗口的最小值
  4. 对于最大值,可以用取相反数,转化成3的问题。

代码:

#include<cstdio>const int maxn = 1000000 + 10;int n, k;
int a[maxn];
int ans1[maxn], ans2[maxn];int head, rear;
int que[maxn];void solve(int res[]) {head = 1; rear = 0;for (int i = 1; i <= n; i++) {while (head <= rear && i - que[head] + 1 > k)que[head++] = 0;while (head <= rear && a[que[rear]] > a[i])que[rear--] = 0;que[++rear] = i;if (i >= k)res[i - k+1] = que[head];}
}int main() {scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}solve(ans1);for (int i = 1; i <= n-k+1; i++)printf("%d ", a[ans1[i]]);printf("\n");for (int i = 1; i <= n; i++)a[i] = -a[i];solve(ans2);for (int i = 1; i <= n-k+1; i++)printf("%d ", -a[ans2[i]]);printf("\n");return 0;
}

STL双端队列实现:

#include<cstdio>
#include<deque>using namespace std;const int maxn = 1000000 + 10;
int a[maxn];
deque<int> dq;int n, k;
int ans1[maxn], ans2[maxn];void solve(int ans[]) {dq.clear();for (int i = 1; i <= n; i++) {while (!dq.empty() && i - dq.front() + 1 > k)dq.pop_front();while (!dq.empty() && a[dq.back()] > a[i])dq.pop_back();dq.push_back(i);if (i >= k)ans[i - k + 1] = dq.front();}
}int main() {scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);solve(ans1);for (int i = 1; i <= n - k + 1; i++)printf("%d ", a[ans1[i]]);printf("\n");for (int i = 1; i <= n; i++)a[i] = -a[i];solve(ans2);for (int i = 1; i <= n-k+1; i++)printf("%d ", -a[ans2[i]]);printf("\n");return 0;
}
http://www.jsqmd.com/news/596673/

相关文章:

  • 新手入门:在快马平台上手第一个rag应用开发
  • Cursor Pro免费激活终极指南:突破AI编程助手限制的完整技术方案
  • VAD-LLaMA:融合长短期上下文与指令微调的视频异常检测与描述生成
  • 2026年浙江地区高频淬火炉专业公司排名,这些品牌值得关注 - 工业设备
  • 5分钟快速上手WireMock UI:可视化Mock服务管理利器
  • Ubuntu 22.04 服务器部署:从零到生产环境的系统调优与配置
  • 2026年武汉热门的网络营销代运营公司推荐:众量引擎的产品特点解析 - 工业品网
  • 小红书、公众号、头条图文内容特点、类型及结构对比解析
  • 3大突破!Path of Building数值革命:从经验猜想到数据驱动的Build构建方法
  • 张雪说 logo 是淘宝 600 块做的,还吐槽了哪吒汽车花 5 亿设计 Logo “必死无疑”
  • 从.m3u8到MP4:一次搞懂流媒体视频下载与FFmpeg格式转换的完整流程
  • 赛马娘DMM版汉化与优化完整指南:轻松实现完美游戏体验
  • 2026届学术党必备的六大AI论文助手实测分析
  • 6大压缩算法实战指南:7-Zip ZS多场景效率优化全攻略
  • 双模型协作方案:Gemma-3-12b-it与小型OCR模型联动处理扫描件
  • 像素艺术爱好者的福音:忍者像素绘卷开箱即用体验与作品集
  • 在YOLOv11中嵌入Coordinate Attention坐标注意力模块
  • 如何确保 SEO 推广合同的执行情况
  • 华硕笔记本合盖设置完全指南:外接显示器场景下的不休眠解决方案
  • RetDec反编译工具完整指南:从新手到专家的逆向工程利器
  • 开源书源配置指南:打造个性化小说阅读体验
  • OFA图像描述模型实战:自动化生成产品电商图描述
  • 戴森球计划燃料棒蓝图完全指南:从入门到精通掌握能源生产
  • H5-Dooring:可视化H5开发的技术革新与实践指南
  • 终极英雄联盟工具箱:League Akari 让你的游戏体验自动化升级
  • PyTorch 2.8镜像企业实操:汽车厂商产品发布会AI视频脚本生成+渲染一体化
  • 淘宝自动化脚本终极指南:每天节省30分钟的淘金币全任务解决方案
  • 资源全能捕获:突破平台限制的5个高效下载方案
  • VideoAgentTrek-ScreenFilter多场景:在线考试监考+远程协作安全审查双模式
  • 如何免费解锁付费内容?bypass-paywalls-chrome-clean工具完全指南