#2495. 滑动窗口 /【模板】单调队列

题目描述

有一个长为 ( n ) 的序列 ( a ),以及一个大小为 ( k ) 的窗口。现在这个窗口从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。例如:

数组是 ([1, 3, -1, -3, 5, 3, 6, 7]), ( k = 3 )。

输入格式

输入一共有两行:

第一行有两个正整数 ( n ) 和 ( k )。

第二行有 ( n ) 个整数,表示序列 ( a )。

输出格式

输出共两行:

第一行为每次窗口滑动的最小值。

第二行为每次窗口滑动的最大值。

样例

输入数据 1
8 3
1 3 -1 -3 5 3 6 7
输出数据 1
-1 -3 -3 -3 3 3
3 3 5 5 6 7

提示

数据范围:

  • 对于 50% 的数据,( 1 \leq n \leq 10^5 )
  • 对于 100% 的数据,( 1 \leq k \leq n \leq 10^6 ),( a_i \in [-2^{31}, 2^{31}) )

参考代码:双端队列实现

#include <bits/stdc++.h>using namespace std;constexpr int N = 1e6 + 7;int a[N], n, k;int main() {cin >> n >> k;for (int i = 0; i < n; i++) cin >> a[i];// 存的是下标// 我们的dq里面一定是单调// 你要么活得比我长// 要么能力比我强deque<int> dq;for (int i = 0; i < n; i++) {// 当前队首的这个点还存活不 --- 窗口长度k// 比如我当前位置是i,窗口长度是3// 可以存在的点是i, i - 1, i - 2if (!dq.empty() && i - k + 1 > dq.front()) {// 比如我现在的i = 6,k = 3 --- 4 5 6三个位置的数// 但是你的dq.frond() = 3,你队首是位置为3的元素// 已经过了你的时代 --- 你该下位了dq.pop_front();}// 我a[i]要把我前面能力没我强,活的没我久的全部干掉// 队列里如果活得没有a[i]久,能力没有a[i]强,a[i]在的一天他们就永无出头之日while (!dq.empty() && a[i] <= a[dq.back()]) dq.pop_back();dq.push_back(i);// 可以输出当前的最小值了 --- 窗口长度至少得达到k才可以开始输出if (i >= k - 1) cout << a[dq.front()] << " ";}cout << "\n";dq.clear();for (int i = 0; i < n; i++) {// 当前队首的这个点还存活不 --- 窗口长度k// 比如我当前位置是i,窗口长度是3// 可以存在的点是i, i - 1, i - 2if (!dq.empty() && i - k + 1 > dq.front()) {// 比如我现在的i = 6,k = 3 --- 4 5 6三个位置的数// 但是你的dq.frond() = 3,你队首是位置为3的元素// 已经过了你的时代 --- 你该下位了dq.pop_front();}// 我a[i]要把我前面能力没我强,活的没我久的全部干掉// 队列里如果活得没有a[i]久,能力没有a[i]强,a[i]在的一天他们就永无出头之日while (!dq.empty() && a[i] >= a[dq.back()]) dq.pop_back();dq.push_back(i);// 可以输出当前的最小值了 --- 窗口长度至少得达到k才可以开始输出if (i >= k - 1) cout << a[dq.front()] << " ";}cout << "\n";return 0;
}

参考代码:手写单调队列

#include <bits/stdc++.h>using namespace std;constexpr int N = 1e6 + 7;int a[N], dq[N];int n, k, head = 0, tail = -1;bool isNotEmpty() { return head <= tail; }int top() { return dq[head]; }void pop_front() { head += 1; }int back() { return dq[tail]; }void pop_back() { tail -= 1; }void push(int x) { dq[++tail] = x; }int main() {cin >> n >> k;for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++) {if (isNotEmpty() && i - k + 1 > top()) pop_front();while (isNotEmpty() && a[back()] >= a[i]) pop_back();push(i);if (i >= k - 1) cout << a[top()] << " ";}cout << "\n";head = 0, tail = -1;for (int i = 0; i < n; i++) {if (isNotEmpty() && i - k + 1 > top()) pop_front();while (isNotEmpty() && a[back()] <= a[i]) pop_back();push(i);if (i >= k - 1) cout << a[top()] << " ";}cout << "\n";return 0;
}

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

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

相关文章

【深度强化学习】关于同一设备上cuda和gpu计算结果不一致问题

文章目录 问题描述关于seed: 跟原文一致补充:万能seed 问题结论cpu和gpu差异来源分析浮点数精度的差异补充报错&#xff1a;Expected all tensors to be on the same device&#xff01;常见运算上的差异累加运算的差异exp运算的差异matmul运算的差异 forward上的差异&#xff…

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 189. 轮转数组122. 买卖股票的最佳时机 II55. 跳跃游戏45. 跳跃游戏 II274. H 指数 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f49d;希望您在这里可以感受到一份轻松…

机器学习云环境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下载对应版本的 OBS Broswer 软件&#xff0c;如图&#xff0c;红框内的为安装文件&#xff0c;蓝色框内的为对应安装文件的校验文件&#xff08;无需下载&#xff09; 以 64 位机为例&#xff0c;下载完…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

618知识狂欢,挑本好书,点亮智慧生活!

618精选编程书单&#xff1a;提升你的代码力 一年一度的618又到啦&#xff01;今年的618就不要乱买啦&#xff0c;衣服买多了会被淘汰&#xff0c;电子产品买多了会过时&#xff0c;零食买多了会增肥&#xff0c;最后怎么看都不划算。可是如果你购买知识&#xff0c;坚持阅读&a…

第N2周:Embeddingbag与Embedding详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 什么是词嵌入&#xff1f; Embedding与EmbeddingBag详解 Embedding Embeddi…

代码随想录算法训练营第十七天|LeetCode110 平衡二叉树、LeetCode257 二叉树的所有路径

题1&#xff1a; 指路&#xff1a;LeetCode110 平衡二叉树 思路与代码&#xff1a; 左右子树的高度差小于等于1。对于这个题&#xff0c;递归比迭代方便太多&#xff0c;我也想过迭代&#xff0c;但是我没有写出来&#xff0c;大家可以自己试一下。递归代码如下&#xff1a;…

如何为ChatGPT编写有效的提示词:软件开发者的指南

作为一名软件开发者&#xff0c;特别是使用Vue进行开发的开发者&#xff0c;与ChatGPT等AI助手高效互动&#xff0c;可以极大地提升你的开发效率。本文将深入探讨如何编写有效的提示词&#xff0c;以便从ChatGPT中获取有用的信息和帮助。 1. 明确目标 在编写提示词之前&#…

后端之路第二站(正片)——SprintBoot之:分层解耦

很抽象&#xff0c;我自己也不好理解&#xff0c;仅作为一个前端转后端的个人理解 一、先解释一个案例&#xff0c;以这个案例来分析“三层架构” 这里我先解释一下黑马程序员里的这个案例&#xff0c;兄弟们看视频的可以跳过这节课&#xff1a;Day05-08. 请求响应-响应-案例_…

【webrtc】m98:Call的创建及Call对音频接收处理

call中多個流共享相同的辅助组件 这几个是与外部共用的 线程传输send控制module 线程任务队列工厂call的辅助组件中各种统计以及接收测的cc是自己创建的 call自己的多个辅助组件是外部传递来的 call 创建多个接收流 这里用一个set 来保存所有指针,并没有要map的意思:

【因果推断从入门到精通二】随机实验3

目录 检验无因果效应假说 硬币投掷的特殊性何在&#xff1f; 检验无因果效应假说 无因果效应假说认为&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治疗而不是ZMapp与此无关。在174例接受mAb14治疗的患者中&#xff0c;113/17464.9%存活了28天&…

【MySQL精通之路】InnoDB(6)-磁盘结构

主要博客&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 1 表 2 索引 【MySQL精通之路】InnoDB(6)-磁盘结构(2)-索引-CSDN博客 3 表空间 【MySQL精通之路】InnoDB(6)-磁盘结构(3)-表空间-CSDN博客 4 双写缓冲区 【MySQL精通之路】InnoDB(6)-磁盘结构(4)-双写缓冲…

修改MySQL root用户密码

ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘new_password’; ALTER USER ‘root’‘%’ IDENTIFIED BY ‘new_password’; 》 SET GLOBAL read_only OFF; select * from mysql.user;

Java入门基础学习笔记47——ArrayList

什么是集合呢&#xff1f; 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似数组。 有数组&#xff0c;为什么还要学习集合呢&#xff1f; 数组定义完成并启动后&#xff0c;长度就固定了。 而集合是大小可变&#xff0c;开发中用的最多的。 集合的特点&#xff1a;大…

汇聚荣科技有限公司优点有哪些?

在当今快速发展的科技时代&#xff0c;企业之间的竞争愈发激烈。作为一家专注于科技创新与研发的公司&#xff0c;汇聚荣科技有限公司凭借其卓越的技术实力和创新能力&#xff0c;在业界树立了良好的口碑。那么&#xff0c;汇聚荣科技有限公司究竟有哪些优点呢?接下来&#xf…

C++利用TinyXML读取XML文件

TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXML被设计为易于使用和集成到C项目中&#xff0c;并且非常适合处理小型XML文件。 以下是TinyXML的一些主要特点和优点&#xff1a; 轻量级: T…

OSPF问题

.ospf 选路 域内 --- 1类&#xff0c;2类LSA 域间 --- 3类LSA 域外 --- 5类&#xff0c;7类LSA --- 根据开销值的计算规则不同&#xff0c;还分为类型1和类型2 ospf 防环机制 区域内防环&#xff1a;在同一OSPF区域内&#xff0c;所有路由器通过交换链路状态通告&#xff…

VUE面试题(3)--vue常见面试题

1.vue优点 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 …

226.翻转二叉树

翻转一棵二叉树。 思路&#xff1a; 指针做交换 用递归&#xff08;前序or后序&#xff0c;中序不行&#xff09; 前序&#xff1a;中左右 遍历到“中”的时候&#xff0c;交换它的左右孩子 然后分别对它的左孩子和右孩子使用“交换函数”&#xff08;定义的&#xff09;&a…