
窗口内偏序
head表示窗口首元素,q[tail]=a[i]后窗口内偏序
while(a[i]<=q[tail])--tail;
q[tail]=a[i];
维护窗口大小
窗口首元素索引head和i就是窗口的大小,需要p数组记录每个偏序窗口元素索引包括首元素索引,确保i-p[head]<=k;否则++head;
当--tail时不再head<=tail就要停止防止超出窗口前界
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1000001;
int n, k;
int q[N]; //队列
int p[N]; //记录下标的数组
int a[N];
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
int head = 1, tail = 0;
//先输出滑动窗口的最小值
for (int i = 1; i <= n; i++)
{
while (a[i] <= q[tail] && head <= tail)
{
--tail;
}
++tail;
q[tail] = a[i];
p[tail] = i;
while (i - p[head] >= k)
{
++head;
}
if (i >= k)
{
printf("%d ", q[head]);
}
}
puts("");
//第二步输出滑动窗口的最大值
head = 1, tail = 0;
for (int i = 1; i <= n; i++)
{
while (a[i] >= q[tail] && head <= tail)
{
--tail;
}
++tail;
q[tail] = a[i];
p[tail] = i;
while (i - p[head] >= k)
{
++head;
}
if (i >= k)
{
printf("%d ", q[head]);
}
}
}
浙公网安备 33010602011771号