牛客每日一题3.30 滑动窗口 单调队列

https://blog.csdn.net/qq_43804974/article/details/105176524
这道题由于空间限制的很死,所以原本用线段树之类O(nlogn)的算法都会MLE,唯一的做法就是O(N)的单调队列。
图片说明

对于每一个滑动窗口的元素,都是从上一个窗口的基础上,增加一个新的元素,减掉一个最后的元素。就利用单调双端队列去处理问题,对于一个新的窗口就push进去,然后不断pop直到出现第一个合法的元素,那个元素就是我们要的这个窗口内的最值的答案,不合法的元素是什么意思呢,就是你这个元素所在的位置太前了, 这个窗口的区间包含不到他,所以只能删掉。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<time.h>
#include<string>
#include<cmath>
#include<stack>
#include<map>
#include<set>
#define ll long long
#define double long double
using namespace std;
#define PI  3.1415926535898
#define eqs 1e-17
const long long max_ = 1e6 + 7;
int mod = 2014;
const int inf = 1e9 + 7;
const long long INF = 1e18;
int read() {
    int s = 0, f = 1;
    char ch = getchar();
    while (ch<'0' || ch>'9') {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0'&&ch <= '9') {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s * f;
}
inline void write(int x) {
    if (x < 0) {
        putchar('-');
        x = -x;
    }
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}
inline int min(int a, int b) {
    return a < b ? a : b;
}
inline int max(int a, int b) {
    return a > b ? a : b;
}
pair<int, int> quemax[max_];
pair<int, int> quemin[max_];
int qmaxL = 1, qmaxR = 0, qminL = 1, qminR = 0;
int n, node[max_],k;
int ansmax[max_], ansmin[max_],an = 0;
signed main() {
    n = read(),k = read();
    for (int i = 1; i <= n; i++) {
        node[i] = read();
    }
    quemax[++qmaxR] = make_pair(node[1], 1);
    quemin[++qminR] = make_pair(node[1], 1);
    for (int i = 2; i <= k; i++) {
        while (qmaxL <= qmaxR && quemax[qmaxR].first < node[i])qmaxR--;
        quemax[++qmaxR] = make_pair(node[i], i);

        while (qminL <= qminR && quemin[qminR].first > node[i])qminR--;
        quemin[++qminR] = make_pair(node[i], i);

    }
    ansmax[++an] = quemax[qmaxL].first, ansmin[an] = quemin[qminL].first;

    for (int i = k + 1; i <= n; i++) {
        //[i - k + 1,i]
        while (qmaxL <= qmaxR && quemax[qmaxR].first < node[i])qmaxR--;
        quemax[++qmaxR] = make_pair(node[i], i);
        while (qmaxL <= qmaxR && quemax[qmaxL].second < i - k + 1)qmaxL++;

        while (qminL <= qminR && quemin[qminR].first > node[i])qminR--;
        quemin[++qminR] = make_pair(node[i], i);
        while (qminL <= qminR && quemin[qminL].second < i - k + 1)qminL++;

        ansmax[++an] = quemax[qmaxL].first, ansmin[an] = quemin[qminL].first;
    }
    for (int i = 1; i <= an; i++) {
        cout << ansmin[i] << " ";
    }
    cout << endl;
    for (int i = 1; i <= an; i++) {
        cout << ansmax[i] << " ";
    }

    return 0;
}
全部评论

相关推荐

烤点老白薯:他第二句话的潜台词是想让你帮他点个瑞幸或者喜茶啥的
mt对你说过最有启发的一...
点赞 评论 收藏
分享
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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