高阶数据结构 --- 单调队列

大家好,这一期,我将带领大家学习一种算法竞赛中常用的数据结构 --- 单调队列

废话不多说,我们直接开始这一期的内容

一:什么是单调队列?

二:单调队列相关算法题

1. 题目一:【单调队列模板题】滑动窗口

cpp 复制代码
#include <iostream>
#include <deque>

using namespace std;

const int N = 1e6 + 10;

int n, k;
int a[N];

int main()
{
    cin >> n >> k;
    for(int i = 1; i <= n; i++) cin >> a[i];

    deque<int> q; // 存下标
    // 窗口内最小值 - 单调递增的队列 - 存下标
    for(int i = 1; i <= n; i++)
    {
        while(q.size() && a[q.back()] >= a[i]) q.pop_back();

        q.push_back(i);

        // 判断队列里面元素是否在合法窗口内
        if(q.back() - q.front() + 1 > k) q.pop_front();

        if(i >= k) cout << a[q.front()] << " ";
    }
    cout << endl;

    // 窗口内最大值 - 单调递减的队列 - 存下标
    q.clear();
    for(int i = 1; i <= n; i++)
    {
        while(q.size() && a[q.back()] <= a[i]) q.pop_back();

        q.push_back(i);

        if(q.back() - q.front() + 1 > k) q.pop_front();
        if(i >= k) cout << a[q.front()] << " ";
    }
    cout << endl;

    return 0;
}

2. 题目二:质量检测

cpp 复制代码
#include <iostream>
#include <deque>

using namespace std;

const int N = 1e6 + 10;

int n, m;
int a[N];

int main()
{
    cin >> n >> m;
    deque<int> q; // 单调递增的队列 - 存下标
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        while(q.size() && a[q.back()] >= a[i]) q.pop_back();

        q.push_back(i);

        if(q.back() - q.front() + 1 > m) q.pop_front();

        if(i >= m) cout << a[q.front()] << endl;
    }

    return 0;
}

好的,今天的分享就先到这里了,谢谢大家!!!

相关推荐
inrichtt5 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger6 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训6 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen6 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy6 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据6 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓6 小时前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
把我格子衫拿来6 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
无忧.芙桃7 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态
erzong2318 小时前
Linux操作系统:线程概念与控制
linux·算法