【每日一题】滑动窗口

滑动窗口

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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 10:39
一个证都没&nbsp;我能填什么
程序员小白条:别人有,你为什么没有,还是这个道理,社会就是比较,竞争,淘汰,你要安逸,那么就要做好淘汰的准备
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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