C++ 算法学习——1.8 单调队列算法

news2024/11/25 1:00:10

单调队列(Monotonic Queue)是一种特殊类型的队列,通常用于解决一些数组或序列相关的问题。和单调栈类似,单调队列也具有一些特定的性质,在解决一些问题时非常有用。以下是关于单调队列的一些重要点:

  1. 定义

    • 单调队列是一种数据结构,队列中的元素满足单调递增或单调递减的性质。
  2. 应用

    • 单调队列通常用于解决一些需要快速找到滑动窗口中的最大值或最小值等问题。它能够在O(1)时间内找到当前队列中的最大值或最小值。
  3. 实现

    • 在C++中,可以使用双端队列std::deque来实现单调队列。通过维护一个递增或递减的双端队列,可以实现单调队列的功能。
  4. 算法步骤

    • 在处理数组或序列时,通常需要遍历元素,维护一个单调队列:
      • 当新元素加入队列时,从队尾开始,将比当前元素小的元素移除,确保队列保持单调递增或单调递减的性质。
      • 当需要获取当前窗口的最大值或最小值时,可以通过队首元素或队尾元素获取。
  5. 时间复杂度

    • 单调队列算法的时间复杂度通常为O(n),其中n是数组或序列的长度。

deque结构的常用操作如下:

#include <iostream>
#include <deque>

int main() {
    // 创建一个双端队列
    std::deque<int> myDeque;

    // 在队尾插入元素
    myDeque.push_back(10);
    myDeque.push_back(20);
    myDeque.push_back(30);

    // 在队首插入元素
    myDeque.push_front(5);

    // 访问队首和队尾元素
    std::cout << "Front element: " << myDeque.front() << std::endl; // 输出 5
    std::cout << "Back element: " << myDeque.back() << std::endl;   // 输出 30

    // 弹出队首和队尾元素
    myDeque.pop_front();
    myDeque.pop_back();

    // 获取队列大小
    std::cout << "Deque size: " << myDeque.size() << std::endl; // 输出 2

    // 遍历队列中的元素
    std::cout << "Elements in the deque:";
    for (int elem : myDeque) {
        std::cout << " " << elem;
    }
    std::cout << std::endl;

    // 清空队列
    myDeque.clear();

    // 检查队列是否为空
    if (myDeque.empty()) {
        std::cout << "Deque is empty" << std::endl;
    } else {
        std::cout << "Deque is not empty" << std::endl;
    }

    return 0;
}

 P1. 洛谷p2032扫描

#include <iostream>
#include <deque>
using namespace std;
// 定义结构体 node,包含值 v 和 id
struct node {
    int v;
    int id;
};

int main() {
    int n, k;
    cin >> n >> k;

    node* a=new node[n]; // 存放元素的结构体数组
    deque<node> qmax; // 保存当前窗口内的最大值

    // 输入元素的值和 id
    for (int i = 1; i <= n; i++) {
        cin >> a[i].v;
        a[i].id = i;
    }

    // 滑动窗口
    for (int i = 1; i <= n; i++) {
        // 维护 qmax,保存窗口内的最大值
        while (!qmax.empty() && qmax.back().v <= a[i].v) {
            qmax.pop_back();//单调队列的代码核心
        }
        qmax.push_back(a[i]);

        // 如果窗口大小超过 k,输出当前窗口的最大值
        if (i >= k) {
            cout << qmax.front().v << endl;
        }

        // 如果窗口的最大值在窗口外,移除
        if (qmax.front().id == i - k + 1) {
            qmax.pop_front();
        }
    }

    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《14天从0到1学Java》第二天之01Java中的分支结构if语句

Hello&#xff0c;大家好&#xff0c;我是Feri&#xff0c;一枚十多年的程序员&#xff0c;研究生&#xff0c;关注我&#xff0c;且看一个平凡的程序员如何在自我成长&#xff0c;也为各位小伙伴提供编程相关干货知识&#xff0c;希望在自我蜕变的路上&#xff0c;我们一起努力…

解决SqlServer自增主键使用MybatisPlus批量插入报错问题

报错 SqlServer 表中主键设置为自增&#xff0c;会报以下错误。 org.springframework.jdbc.UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获…

深入理解HTTP Cookie

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 HTTP Cookie定义工作原理分类安全性用途 认识 cookie基本格式实验测试 cookie 当我们登录了B站过后&#xff0c;为什么下次访问B站就…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

KDTS 实现MySQL至KingbaseES迁移实践

此文章以linux环境实践&#xff0c;KingbaseES一下使用KES代替。 KDTS KDTS工具安装KES时会一起安装&#xff0c;一般存在目录为&#xff1a;ClientTools目录下guitools文件夹中 启动 进入KDTS-WEB下bin目录&#xff0c;执行sh文件 cd /opt/Kingbase/ES/V8/ClientTools/guit…

汽车胶黏剂市场研究:预计2030年全球市场规模将达到67.4亿美元

汽车胶黏剂是指专门用于汽车制造和维修过程中&#xff0c;用于粘接、密封和固定各种汽车部件的化学材料。它们在汽车行业中扮演着关键角色&#xff0c;广泛应用于车身、内饰、玻璃、电子元件和其他组件的粘接与密封。汽车胶黏剂旨在提高汽车的结构强度、耐用性、密封性以及舒适…

【JS】浏览器切换标签页导致计时器不准

现有一段计时器代码 function count() {let n 0const timer setInterval(() > {console.log(n);if (n > 200) {clearInterval(timer)}n}, 10) } count()效果如下&#xff0c;当计时过程中切换标签页&#xff0c;定时器的时间会放缓&#xff0c;再次切回标签页后&#…

MMDetection研究-1.入门及框架

记录MMDetection研究过程 0.前言 参考: 1.MMDetection框架入门教程(完全版) 2. 1.框架概述 MMDetection是商汤和港中文大学针对目标检测任务推出的一个开源项目,它基于Pytorch实现了大量的目标检测算法,把数据集构建、模型搭建、训练策略等过程都封装成了一个个模块,…

数据排列组合实现

示例 将以下几组数据 &#xff08;“01”, “02”&#xff09;&#xff0c;&#xff08;“A1”, “A2”, “A3”&#xff09;&#xff0c;&#xff08;“B1”, “B2”&#xff09;&#xff0c;&#xff08;“D1”, “D3”&#xff09;排列组合成&#xff0c;如&#xff1a;01:…

Isaac Sim软体仿真(以果实采摘场景为例)

如题,在做果蔬采摘的相关项目,背景是通过Isaac Sim做基于强化学习的果蔬采摘,因此简单搭建了一下场景。 效果如下图: 场景 物理环境(重力等):Create --> Physics --> Physics Scene   地面:Create --> Physics --> Ground Plane   灯光:新建文件自带…

基于SpringBoot+Vue的疫情居家办公系统(带1w+文档)

基于SpringBootVue的疫情居家办公系统(带1w文档) 基于SpringBootVue的疫情居家办公系统(带1w文档) 与传统疫情居家办公管理方案对比&#xff0c;应用疫情居家办公管理系统具备很多特点&#xff1a;最先&#xff0c;可以有效地提高疫情居家办公管理信息查找&#xff0c;仅需键入…

NL2SQL之DB-GPT-Hub详解篇:text2sql任务的微调框架和基准对比

NL2SQL之DB-GPT-Hub<详解篇>:text2sql任务的微调框架和基准对比 随着生成式人工智能(Artificial Intelligence Generated Content&#xff0c;简写为 AIGC)时代的到来&#xff0c;使用大规模预训练语言模型(LLM)来进行 text2sql 任务的 sql 生成也越来越常见。基于 LLM 的…

小程序智能视频制作SDK解决方案,云端智能视频制作

无论是个人分享生活的点滴&#xff0c;还是企业展示品牌故事&#xff0c;一段精心制作的视频总能迅速抓住观众的眼球&#xff0c;传递无限价值。专业视频制作往往门槛较高&#xff0c;不仅需要专业的技能和设备&#xff0c;还耗费大量时间和精力。面对这一挑战&#xff0c;美摄…

软件项目开发流程与团队分工整体认知——基于《信息系统项目管理师教程》(需求分析、系统设计、开发、测试、部署与运维、开发工具与管理软件)

文章目录 1、信息系统项目管理师教程——精简说明2、软件工程开发流程与团队分工详解2.1 需求分析2.2 系统设计2.3 开发2.4 测试2.5 部署与运维 3、开发工具与管理软件4、总结 1、信息系统项目管理师教程——精简说明 在《信息系统项目管理师教程》中&#xff0c;有一些章节对…

【JAVA开源】基于Vue和SpringBoot的卫生健康系统

本文项目编号 T 076 &#xff0c;文末自助获取源码 \color{red}{T076&#xff0c;文末自助获取源码} T076&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

食堂订餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;攻略信息管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品&#xf…

vscode快速删除一行的快捷键不管用

vscode快速删除一行的快捷键 在vscode中&#xff0c;快速删除一行的快捷键是CtrlShiftk。 因为搜狗软键盘的快捷键和这个快捷键的按键是冲突了&#xff0c;所以快捷键被搜狗输入法给拦截了。把搜狗软键盘的快捷键关闭了或者修改成别的键就好了&#xff0c; 因为我不怎么用软键…

Meta推出的AI视频音频生成模型:Movie Gen

Meta Movie Gen&#xff0c;由 Meta 精心打造的 AI 视频和音频生成工具&#xff0c;能够让用户通过简洁的文本提示轻松创造出高清晰度的视频和音效&#xff0c;并实现精确的视频编辑。用户只需提供文本描述&#xff0c;即可生成高清视频&#xff1b;或者上传图片&#xff0c;便…

python22_replace替换

replace替换 a helloworlddef replace(s, old, new):return new.join(s.split(old))def replace_other(s, number):return s.replace(a[number], m)if __name__ "__main__":print(f"输出结果为{replace(a, hello, world)}")print(f"输出结果为{rep…

Window系统编程 - 文件操作

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天主要介绍使用windows系统编程操作读写文件 文件 CreateFile()函数讲解 介绍:该函数用于打开文件或者I/O流设备&#xff0c;文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和…