窗口内偏序
    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]);
        }
    }
}
 
posted on 2021-07-02 16:49  offer快到碗里来~  阅读(50)  评论(0)    收藏  举报