【每日一题】滑动窗口

滑动窗口

http://www.nowcoder.com/questionTerminal/b4d345a65640432db06ac978ccb6e23a

维护一个单调队列,以最小值为例,队首是最小值的下标,将新加入的元素加入到队尾,但要pop掉那些比新加入元素还要大的元素再加入队尾(即如果比队首最小值还要小将整个队列pop掉再加入队尾),但是队首元素不一定就是这个窗口的答案,它可能在窗口的左边,所以从队首开始pop掉那些下标比i-m还要小的元素,最大值同理;

#include <cstdio>
#include <queue>
using namespace std;
const int N = 1e6+10;
int n,m,a[N];
void mi_deque(){
    deque<int> q;
    for(int i = 0;i < n;i++){
        while(!q.empty()&&a[q.back()] > a[i]){
            q.pop_back();
        }
        q.push_back(i);
        while(!q.empty()&&q.front() <= i-m){
            q.pop_front();
        }
        if(i >= m-1){
            printf("%d ",a[q.front()]);
        }
    }
    puts("");
}
void mx_deque(){
    deque<int> q;
    for(int i = 0;i < n;i++){
        while(!q.empty()&&a[q.back()] < a[i]){
            q.pop_back();
        }
        q.push_back(i);
        while(!q.empty()&&q.front() <= i-m){
            q.pop_front();
        }
        if(i >= m-1){
            printf("%d ",a[q.front()]);
        }
    }
    puts("");
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++) scanf("%d",a+i);
    mi_deque();
    mx_deque();
    return 0;
}
全部评论

相关推荐

舂锋:不能投什么岗都用一份简历,一般都是要看企业的岗位需求来写职业技能或者是项目经历,跟岗位相关的就写多一点。
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 13:46
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务