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

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

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

一:什么是单调队列?

二:单调队列相关算法题

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;
}

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

相关推荐
WolfGang00732113 分钟前
代码随想录算法训练营 Day53 | 图论 part11
算法·图论
呃呃本16 分钟前
算法题(图论)
算法·图论
一只数据集23 分钟前
商超上货人形机器人全身运控数据集分析——Kuavo 5机器人5W型号夹爪末端执行器操作轨迹数据
人工智能·算法·机器人
蜡笔小马32 分钟前
03.C++设计模式-原型模式
c++·设计模式·原型模式
神仙别闹37 分钟前
基于QT(C++)实现线性表的建立、插入、删除、查找等基本操作
java·c++·qt
谙弆悕博士1 小时前
【附Python源码】基于决策树的信用卡欺诈检测实战
python·学习·算法·决策树·机器学习·数据分析·scikit-learn
MATLAB代码顾问1 小时前
黏菌算法(SMA)原理详解与Python实现
开发语言·python·算法
salipopl1 小时前
C/C++ 中 volatile 关键字详解:原理、作用与实际应用
开发语言·c++
张赫轩(不重名)1 小时前
图论3:连通性问题(复杂度均为 O(N + M) )
c++·算法·图论·拓扑学