gwl999

博客园 首页 新随笔 联系 订阅 管理
  34 随笔 :: 0 文章 :: 0 评论 :: 2058 阅读

5.17

记一次错误: Segmentation Fault-> 如果开辟数组的大小比题意中的小可能出现此错误

单调队列:


  • 队列满足先进先出的规则;

  • 单调队列则又同时满足单调的规则;

  • 可用来解决某一个区间的最小值,也是滑动窗口的典型案例

  • 题目链接:154. 滑动窗口 - AcWing题库

  • #include "iostream"
    using namespace std;
    const int N = 1000010;
    int a[N], q[N], hh, tt = -1;
    // hh是队列的头,tt是队列的尾
    //同时队列中q[]记录的是位置
    int main() {
        //步骤:
        // 1.遍历所有位置;
        // 2.根据k的值先找到每满足窗口的位置;
        // 3.将队列变成单调的;
        int n, k;
        cin >> n >> k;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 0; i < n; i++) {
            if (hh <= tt && i - k + 1 > q[hh])
                // i-k+1>q[hh]是满足滑动窗口大小的条件
                hh++;
            while (hh <= tt && a[q[tt]] > a[i])
                //这步就是队列对此题优化的关键,即如果前一个数小于位置小于后面数,同时前面数的大小比后面大,成逆序关系,就需要将队列的尾去减减
                tt--;
            q[++tt] = i;
            //每次读入新的位置
            if (i >= k - 1)
                //如果是满足队列窗口的大小的条件
                cout << a[q[hh]] << " ";
        }
        //单调递增同理,直接上升就行。
        hh = 0, tt = -1;
        cout << endl;
        for (int i = 0; i < n; i++) {
            if (hh <= tt && i - k + 1 > q[hh])
                hh++;
            while (hh <= tt && a[q[tt]] < a[i])
                tt--;
            q[++tt] = i;
            if (i >= k - 1)
                cout << a[q[hh]] << " ";
        }
        cout << endl;
        return 0;
    }
posted on   呓雫  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示