滑動窗口,單調隊列

牛客滑動窗口
算法思想:
利用雙端隊列(deque)維護一個單調隊列,再利用滑動區間遍歷就可以了;

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+66;
int a[N];
int n,k;
void get_max()
{
    deque<int > q;
    for(int i=0;i<=n;++i){
        if(i>=k){
         printf("%d ",q.front());
         if(a[i-k]==q.front())
             q.pop_front();
        }
        while(!q.empty()&&q.back()<a[i])
            q.pop_back();
        q.push_back(a[i]);
    }
    printf("\n");
}
void get_min()
{
    deque<int >q;
    for(int i=0;i<=n;++i){
        if(i>=k){
            printf("%d ",q.front());
            if(a[i-k]==q.front())
                q.pop_front();
        }
        while(!q.empty()&&q.back()>a[i])
            q.pop_back();
        q.push_back(a[i]);
    }
    printf("\n");
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;++i)
        scanf("%d",&a[i]);
    get_min();
    get_max();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章