AcWing 154. 算法基础班--习题--P33 滑动窗口(单调队列)
原题链接
简单
作者:
初静
,
2021-03-25 09:00:51
,
所有人可见
,
阅读 352
参考题解1:
参考题解2:
#include <iostream>
using namespace std;
const int N = 1000010;
int a[N], q[N];
int n, k;
int main () {
cin >> n >> k;
for (int i = 0; i < n; i ++) cin >> a[i];
int hh = 0, tt = -1; // 初始化队列
for (int i = 0; i < n; i ++) {
if (hh <= tt && i - k + 1 > q[hh]) hh ++; // 判断队头是否已经滑出滑动窗口。当i - k + 1 == q[hh]时还没有队头还没有滑出
while (hh <= tt && a[q[tt]] >= a[i]) tt --;
q[++ tt] = i; //队列是空,也要进队,所以不用加 if (hh <= tt)
if (i - k + 1 >= 0) printf("%d ", a[q[hh]]);
}
puts("");
hh = 0, tt = -1; // 初始化队列
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 >= 0) printf("%d ", a[q[hh]]); // i + 1 >= k 即窗口完全滑入数组就可以输出,不是指当滑动窗口值为满才输出
}
puts("");
return 0;
}