[Acwing]154. 滑动窗口 原创

算法标签 单调栈 滑动窗口

题目简叙

在这里插入图片描述

思路

模拟队列 利用单调队列的思路来控制
队列放的是原本字符串的下标

查询最小值
每次检查数值是否小于队尾元素,如果是,则循环删去队尾,直到新元素比前一个元素更大
这样我们就营造了一个递增的单调序列,最小值永远是队头
然后返回队头即可

代码

#include<iostream>
#include<vector>

using namespace std;

int n,k,tmp;
const int N=1e6+10;
int a[N];
int q[N];

int main(){
    cin>>n>>k;
    
    for(int i=0;i<n;i++)cin>>a[i];
    
    int st=0,ed=-1;
    for(int i=0;i<n;i++){
        if(st<=ed&&q[st]<i-k+1)st++;//如果当前队头元素太小了,不在K的范围区间,则删除对头
        while(st<=ed&&a[i]<a[q[ed]])ed--;//每次检查数值是否小于队尾元素,如果是,则循环删去队尾,直到新元素比前一个元素更大
        q[++ed]=i;//队尾添加新的下标
        if(i>=k-1)cout<<a[q[st]]<<" ";//如果扫描位置到了k-1,表明从现在开始需要反映出各个窗口的最小值
    }
    
    st=0,ed=-1;
    cout<<endl;

    for(int i=0;i<n;i++){
        if(st<=ed&&q[st]<i-k+1)st++;
        while(st<=ed&&a[q[ed]]<=a[i])ed--;
        q[++ed]=i;
        if(i>=k-1)cout<<a[q[st]]<<" ";
    }
    
    return 0;
}

AC记录

在这里插入图片描述

posted @   俺叫西西弗斯  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示