AcWing 154. 滑动窗口
原题链接
简单
作者:
aventador
,
2020-03-01 10:48:49
,
所有人可见
,
阅读 676
C++ 代码
- 构造单调队列解决,数据从队尾进入,从队头输出,队列存的是原始数据的下标
- 每次输出最小值的时候,从队首到队尾是单调递增的
- 当队列非空且队列头滑出窗口外了则需要hh++
- 当队列非空且队尾元素<=(>=)当前数据,tt–
- 数据入队
- 输出
# include <iostream>
using namespace std;
const int N = 1000010;
int a[N], q[N];
int main()
{
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i ++) scanf("%d", &a[i]);
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++)
{
if (hh <= tt && i - k + 1 > q[hh]) hh ++;
while (hh <= tt && a[i] <= a[q[tt]]) tt --;
q[ ++tt] = i;
if (i >= k - 1 ) 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[i] >= a[q[tt]]) tt --;
q[ ++tt] = i;
if (i >= k - 1 ) printf("%d ", a[q[hh]]);
}
puts("");
return 0;
}