AcWing 154. 滑动窗口
原题链接
简单
作者:
现代修士o_O
,
2021-04-22 17:31:05
,
所有人可见
,
阅读 272
#include <cstdio>
const int N = 1000010;
int n, k;
int a[N], q[N]; // q存储的是下标
int main()
{
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 ++ )
{
//判断队头是否已经滑出窗口
//队列不为空,意味存在元素。还要窗口的左边下标要 <= q[hh] 才可
if (hh <= tt && i - k + 1 > q[hh]) hh ++ ; //队头的下标在窗口的左边,所有去掉队头,每次最多一个元素超过窗口,所以用if,No while
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 ++ )
{
//判断队头是否已经滑出窗口
//队列不为空,意味存在元素。还要窗口的左边下标要 <= q[hh] 才可
if (hh <= tt && i - k + 1 > q[hh]) hh ++ ; //队头的下标在窗口的左边,所有去掉队头,每次最多一个元素超过窗口,所以用if,No while
while (hh <= tt && a[i] >= a[q[tt]]) tt -- ;
q[ ++ tt] = i;
if (i >= k - 1) printf("%d ", a[q[hh]]);
}
puts("");
return 0;
}