AcWing 154. 滑动窗口(模板)

 ̄綄美尐妖づ 提交于 2020-03-05 23:13:47

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述
常见模型:找出滑动窗口中的最大值/最小值

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1e6 + 10;

int q[N];               //队列里存的是下标
int n, k, a[N];

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)
    {
        if(hh <= tt && i - k + 1 > q[hh])   hh++;
        while(hh <= tt && a[q[tt]] >= a[i]) tt--;
        q[++tt] = i;        //最小值可能是a[i],所以要先加入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[q[tt]] <= a[i]) tt--;
        q[++tt] = i;
        if(i >= k - 1)  printf("%d ", a[q[hh]]);
    }
    
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!