单调队列
单调队列分为递增队列和递减队列,一般用来求某个固定长度(例如:滑动窗口的最值)序列中的最大/最小值。
对于递增队列,队首元素就是最小值。
对于递减队列,队首元素就是最大值。
1.递增队列(队列首尾最小值)
if(q.empty()) q.push_back(A[i]); else if(q.back()>A[i]){ while((!q.empty())&&q.back()>A[i]){ q.pop_back(); } q.push_back(A[i]); } else q.push_back(A[i]);
2.递减队列(队列首尾最大值)
if(q.empty()) q.push_back(A[i]); else if(q.back()<A[i]){ while((!q.empty())&&q.back()<A[i]){ q.pop_back(); } q.push_back(A[i]); } else q.push_back(A[i]);
示例:
求滑动窗口的最大值,题目链接 https://leetcode.com/problems/sliding-window-maximum/
class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { deque<int> dp; vector<int> ans; for (int i=0; i<nums.size(); i++) { while(!dp.empty() && dp.back() < nums[i])dp.pop_back(); dp.push_back(nums[i]); if (i >= k - 1) { ans.push_back(dp.front()); // 此窗口的最大值加入到返回值中 if (nums[i - k + 1] == dp.front())dp.pop_front(); // 如果滑动窗口移动一次将队首元素移动出去了 } } return ans; } };
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
· Vue3封装支持Base64导出的电子签名组件