5.17
记一次错误: Segmentation Fault-> 如果开辟数组的大小比题意中的小可能出现此错误
单调队列:
-
队列满足先进先出的规则;
-
单调队列则又同时满足单调的规则;
-
可用来解决某一个区间的最小值,也是滑动窗口的典型案例
-
题目链接:154. 滑动窗口 - AcWing题库
-
#include "iostream" using namespace std; const int N = 1000010; int a[N], q[N], hh, tt = -1; // hh是队列的头,tt是队列的尾 //同时队列中q[]记录的是位置 int main() { //步骤: // 1.遍历所有位置; // 2.根据k的值先找到每满足窗口的位置; // 3.将队列变成单调的; int n, k; cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) { if (hh <= tt && i - k + 1 > q[hh]) // i-k+1>q[hh]是满足滑动窗口大小的条件 hh++; while (hh <= tt && a[q[tt]] > a[i]) //这步就是队列对此题优化的关键,即如果前一个数小于位置小于后面数,同时前面数的大小比后面大,成逆序关系,就需要将队列的尾去减减 tt--; q[++tt] = i; //每次读入新的位置 if (i >= k - 1) //如果是满足队列窗口的大小的条件 cout << a[q[hh]] << " "; } //单调递增同理,直接上升就行。 hh = 0, tt = -1; cout << endl; for (int i = 0; i < n; i++) { if (hh <= tt && i - k + 1 > q[hh]) hh++; while (hh <= tt && a[q[tt]] < a[i]) tt--; q[++tt] = i; if (i >= k - 1) cout << a[q[hh]] << " "; } cout << endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示