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

《算法竞赛从入门到国奖》算法基础:数据结构-单调队列

💡Yupureki:个人主页

✨个人专栏:《C++》 《算法》《Linux系统编程》《高并发内存池》


🌸Yupureki🌸的简介:


目录

前言

1. 【模板】单调队列 / 滑动窗口

算法原理

代码实现

2. 质量检测

算法原理

代码实现


前言

单调队列,顾名思义,就是存储的元素要么单调递增要么单调递减的队列。注意,这里的队列和普通的队列不一样,是一个双端队列,因此在数据结构上,我们一般选择deque

单调队列⼀般用于解决滑动窗口内最大值最小值问题,以及优化动态规划

1. 【模板】单调队列 / 滑动窗口

题目链接:

P1886 【模板】单调队列 / 滑动窗口 - 洛谷

算法原理

窗口内最大值:

从左往右遍历元素,维护一个单调递减的队列:

当前元素进队之后,注意维护队列内的元素在大小为k的窗口内;

此时队头元素就是最大值。


窗口内最小值:

从左往右遍历元素,维护一个单调递增的队列:
当前元素进队之后,注意维护队列内的元素在大小为k的窗口内;
此时队头元素就是最小值。

注意:

单调队列中一般用于滑动窗口求最大值或最小值,那么当滑动窗口移动时,还要移除不在窗口中的元素,具体实现方案:在队列中存储数组元素的下标,当新元素从队尾入队列后,他就是新的队尾,也是最新的元素,如果队尾元素的下标 - 队首元素的下标 >= 滑动窗口大小,则直接让队首出列

while (q.back() - q.front() >= k) q.pop_front();

代码实现

#include <iostream> #include <vector> #include <deque> using namespace std; int main() { int n,k; cin >> n >> k; vector<int> v; deque<int> q; for (int i = 0; i < n; i++) { int num; cin >> num; v.push_back(num); } for (int i = 0; i < n; i++) { while (q.size() && v[q.back()] > v[i]) q.pop_back(); q.push_back(i); while (q.size() && q.back() - q.front() >= k) q.pop_front(); if(i >= k -1 && i < n) cout << v[q.front()] << " "; } while (q.size()) q.pop_front(); cout << endl; for (int i = 0; i < n; i++) { while (q.size() && v[q.back()] < v[i]) q.pop_back(); q.push_back(i); while (q.size() && q.back() - q.front() >= k) q.pop_front(); if (i >= k -1 && i < n) cout << v[q.front()] << " "; } return 0; }

2. 质量检测

题目链接:

P2251 质量检测 - 洛谷

算法原理

滑动窗口求最小值,用递减的单调队列

代码实现

#include <iostream> #include <vector> #include <deque> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> v; for (int i = 0; i < n; i++) { int num; cin >> num; v.push_back(num); } deque<int> q; for (int i = 0; i < n; i++) { while (q.size() && v[q.back()] > v[i]) q.pop_back(); q.push_back(i); while (q.back() - q.front() >= m) q.pop_front(); if (i >= m-1) cout << v[q.front()]<<endl; } return 0; }
http://www.jsqmd.com/news/465977/

相关文章:

  • 别再直接 git push 了!这个“魔法“参数让你的代码质量翻倍
  • Java面向对象—JDBC外键和时间的处理
  • 抖音代运营公司如何选?这份参考指南请收好,小红书代运营/GEO优化/网络营销/网络推广/新闻发布,抖音代运营品牌怎么选择 - 品牌推荐师
  • 【AI】举例说明open claw运行原理
  • MySQL数据库 约束
  • 2026年婚恋服务优质机构推荐榜精准匹配有保障:附近有婚介所/女士征婚/婚介信息/婚介平台/婚介机构/婚恋公司/选择指南 - 优质品牌商家
  • 对所做的决策负责
  • Mysql--07
  • CH32V307 - USART串口收发文本数据详解(第九章)
  • 测试开发效率翻10倍!这10款AI Skills神器,我敢说90%的人没用过
  • Turnitin AI率如何从58%降到0%?一个误区你必须知道!
  • WrenAI 深度解析:Text-to-SQL 的“最后一公里”:为什么我们需要 WrenAI 的语义建模?
  • 数组名本质揭秘:首元素地址的两大例外
  • 南京大境空间设计是值得推荐的装修设计公司吗,品牌实力如何? - 工业品网
  • C语言指针的引入
  • 网站提示“Table xxx.pb_content doesnt exist”(数据表不存在)问题|已解决
  • JWT详解:从登录认证到令牌验证
  • 大厂集体“捞虾”:腾讯派出了它的先遣队
  • STM32开发板
  • 机器学习做材料性能的回归预测氧离子电导率模型需要按材料成分分组划分训练测试集吗?
  • 2026探寻常德市淘发源生物科技,从信息看其口碑和专业性 - 工业设备
  • Parse error 语法错误:10种常见原因 + 修复方法
  • Python基于flask+uniapp微信小程序的校园学生宿舍报修管理系统
  • 面试别再只说“我会写用例”:测试黑话升级,薪资翻倍秘籍
  • 2026年3月新疆门窗维修服务团队综合评测与选购指南 - 2026年企业推荐榜
  • [特殊字符] 从零搭建网页项目:从创建到预览全流程
  • ByteBuddy系列文章目录
  • ASP.NET Core面试精讲系列八
  • 访问后台路径(admin.php)时,提示“403 Forbidden”,无法进入后台,前台可正常访问原因分析
  • Python基于flask+uniapp微信小程序的校园学生社团签到系统 可视化