首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【简单】滑动窗口(单调队列

有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。...第一行包含两个整数 n 和 k ,分别代表数组的长度和滑动窗口的长度。第二行有 n 个整数,代表数组的具体数值。同行数据之间用空格隔开。 输出格式 输出包含两个。...第一行输出,从左至右,每个位置滑动窗口中的最小值。 第二行输出,从左至右,每个位置滑动窗口中的最大值。...输入样例 8 3 1 3 -1 -3 5 3 6 7 输出样例 -1 -3 -3 -3 3 3 3 3 5 5 6 7 题解 (单调队列) 数据结构 数组模拟队列,类似于单调栈,将不满足单调性的元素弹出队列...C++ 代码 #include using namespace std; const int N = 1000010; int n, k; int a[N], q[N];//

32220
您找到你想要的搜索结果了吗?
是的
没有找到

滑动窗口最大值:单调队列

滑动窗口最大值 难度困难2154收藏分享切换为英文接收动态反馈 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。...滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。...一般来说,单调队列使用 C++ 中的 deque 来实现会更好,因为其支持双端的插入删除以及获取双端元素!...1、队列维护数组下标 滑动窗口最大值 | 图解单调队列 | 最清晰易懂的讲解【c++/java】 ​ ⚜️为什么要维护数组的下标呢❓❓❓ ​ 因为每次我们需要去控制这个窗口移动,并保持让队列中的元素都落于这个窗口内...[C++]滑动窗口最大值–单调队列 ​ 这种方法可能是我们会比较先于维护数组下标而想到的,因为通常来说我们都会先去想怎么存放这个值,而不是存放对应下标,也确实,这道题如果是维护元素的值,那么相对于第一种方法来说会更容易出错一点

47720

「单调队列」数据结构解决滑动窗口问题

「单调栈」主要解决 Next Great Number 一类算法问题,而「单调队列」这个数据结构可以解决滑动窗口问题。...我们之前的爆文 滑动窗口解题套路框架 讲的滑动窗口算法是双指针技巧的一种,是解决子串、子数组的通用技巧;而本文说的滑动窗口是比较具体的问题。...比如说力扣第 239 题「滑动窗口最大值」,难度 Hard: 给你输入一个数组nums和一个正整数k,有一个大小为k的窗口在nums上从左至右滑动,请你输出每次窗口中k个元素的最大值。...这种问题的一个特殊点在于,「窗口」是不断滑动的,也就是你得动态地计算窗口中的最大值。...下面我们开始重头戏,单调队列的实现。 二、实现单调队列数据结构 观察滑动窗口的过程就能发现,实现「单调队列」必须使用一种数据结构支持在头部和尾部进行插入和删除,很明显双链表是满足这个条件的。

34530

C++】算法集锦(7)滑动窗口

---- 这是暴力解法吧,不知道为什么他们要叫这种解法为滑动窗口,还给出了不低的难度系数。。...如果看不懂我上面的表述,可以看图:(一图胜千言) ---- 通过归纳,我们可以勾勒出滑动窗口法的大体框架(只是基本框架,根据不同的问题应适当变动,重在把握精神) 初始化窗口端点L,R,一般L为0,R为...思路: 这道题主要用到思路是:滑动窗口 什么是滑动窗口?...其实就是一个队列,比如例题中的 abcabcbb,进入这个队列窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列! 如何移动?...我们只要把队列的左边的元素移出就行了,直到满足题目要求! 一直维持这样的队列,找出队列出现最长的长度时候,求出解!

83710

使用单调队列解决 “滑动窗口最大值” 问题

单调队列的典型问题 单调队列是一种用来高效地解决 “滑动窗口最大值” 问题的数据结构。 举个例子,给定一个整数数组,要求输出数组中大小为 K 的窗口中的最大值,这就是窗口最大值问题。...而如果窗口从最左侧逐渐滑动到数组的最右端,要求输出每次移动后的窗口最大值,这就是滑动窗口问题。这个问题同时也是 LeetCode 上的一道典型例题:LeetCode · 239....现在我们不这么做,我们把滑动窗口中的所有元素缓存到某种数据容器中,每次窗口滑动后也向容器增加一个新的元素,而容器的最大值就自然是滑动窗口的最大值。...最先加入容器的元素,如果超出了滑动窗口的范围,也直接将其丢弃(先进先出逻辑)。所以这个容器数据结构要用双端队列实现。...下面,我们先从优先队列说起。 ---- 3. 优先队列解法 寻找最值的问题第一反应要想到二叉堆。 我们可以维护一个大顶堆,初始时先把第一个滑动窗口中的前 k - 1个元素放入大顶堆。

1K20

栈与队列——239. 滑动窗口最大值

1 题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。...返回 滑动窗口中的最大值 。...然而这个最大值可能并不在滑动窗口中,在这种情况下,这个值在数组nums 中的位置出现在滑动窗口左边界的左侧。...因此,当我们后续继续向右移动窗口时,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。我们不断地移除堆顶的元素,直到其确实出现在滑动窗口中。...此时,堆顶元素就是滑动窗口中的最大值。为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在优先队列中存储二元组(num, indez),表示元素num在数组中的下标为indez。

20920

滑动窗口入门

既然是一个类型的题目,我们首先来了解下滑动窗口的2个概念: 滑动:指一个区间往一个方向进行移动,本题中使用从左到右的方式进行滑动。...窗口:也就是一个区间,这个区间可能会增大,也可能会缩小,也可能是固定的。在本题中,我们可以使用队列来表示窗口,这个队列可大可小,要求其最大值。 但是光有这两个概念根本解决不了本题,我们还缺什么呢?...是的,是窗口要如何变化,如何变大或者缩小。这是问题的核心。 对于字符串abcabcbb,一开始肯定是将a放到队列中,接着放入b,每次放入字符的时候,我们都要检查队列里面有没有相同的字符。...显然,光有滑动窗口是不够的,我们还需要一个数据结构来记录队列里面是否存在某个字符,于是我们加入辅助的结构set。...C++代码 class Solution { public: int lengthOfLongestSubstring(string s) { if (s.size()

56650

滑动窗口协议

在计算机网络中实现“流水线技术”的方法是“滑动窗口协议”。 GBN GBN协议(回退N步),它允许发送多个分组而不需要等待确认。但它受限制于窗口的大小N。 ? GBN协议也常被成为滑动窗口协议。...在GBN协议中,发送方首先检查窗口大小是否是满的,如果没有满,那么就产生一个分组并将其发送,并且同时更新变量。如果窗口已经满了,那么发送方给上层指出已满。然后上层会等一会再来试。...发送方收到ACK,如果该分组序号在窗口内,则SR标记该分组为已接受。如果该分组序号等于窗口起始位置序号,那么该窗口移动到具有最小序号的未确认分组处,然后发送该窗口内可发送但未发送的分组。...接收方此时也拥有一个窗口,如果分组序号在该窗口范围内,并且以前没收到过,那么缓存该分组,回复一个ACK给发送方。...因此窗口的大小和序号之间的关系必须是合理的。 ? Ns是发送方窗口大小,Nr是接收方窗口大小,k是序号的位数。

1.2K20

TCPIP滑动窗口

T C P使用一种窗口(w i n d o w)机制来控制数据流。当一个连接建立时,连接的每一端分配一个缓冲区来保存输入的数据,并将缓冲区的尺寸发送给另一端。...剩余的缓冲区空间的大小被称为窗口( w i n d o w) ,指出窗口大小的通知称为窗口通告(window advertisement) 。接收方在发送的每一确认中都含有一个窗口通告。  ...然而,如果发送方操作的速度快于接收方(由于C P U更快) ,接收到的数据最终将充满接收方的缓冲区,导致接收方通告一个零窗口( zero window) 。...发送方收到一个零窗口通告时,必须停止发送,直到接收方重新通告一个正的窗口。 TCP的特点之一是提供体积可变的滑动窗口机制,支持端到端的流量控制。...TCP/IP中滑动窗口的意义 1.在不可靠链路上可靠地传输帧(核心功能) 2.用于保持帧的传输顺序 3.它有时支持流量控制,这是一种接收方能够控制发送方的一种反馈机制

1.4K50

window滑动窗口

Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。...比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口计算。...所以每个滑动窗口操作,都必须指定两个参数,窗口长度以及滑动间隔,而且这两个参数值都必须是batch间隔的整数倍。...(Spark Streaming对滑动窗口的支持,是比Storm更加完善和强大的) 1.png 1.png 案例:热点搜索词滑动统计,每隔10秒钟,统计最近60秒钟的搜索词的搜索频次,并打印出排名最靠前的...​​// 第二个参数,是窗口长度,这里是60秒 ​​// 第三个参数,是滑动间隔,这里是10秒 ​​// 也就是说,每隔10秒钟,将最近60秒的数据,作为一个窗口,进行内部的RDD的聚合,然后统一对一个

75510

滑动窗口协议

为了完成流量控制,TCP使用滑动窗口协议,使用这种方法的时候,发送方和接收方向外通信各使用一个窗口。...这个窗口覆盖了缓存的一部分,在缓存中的字节是从应用进程传送来的,在这个窗口中的字节就是可以发送而不必考虑确认的。这个想象的窗口有两个边沿:一个在左,一个在右。...这个窗口叫做滑动窗口,因为左沿和右沿都可以滑动。 ?                            ...右沿窗口向右移动表示展开窗口,说明允许从缓存中发送更多新的字节;   左沿窗口向右移动表示合拢窗口,说明某些字节已经被确认了,发送端不必再担心它们。 1....发送窗口中相关的有四个概念:已发送并收到确认的数据(不再发送窗口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之中)、允许发送但尚未发送的数据以及发送窗口外发送缓冲区内暂时不允许发送的数据;

873110

队列的最大值滑动窗口的最大值

,找出所有滑动窗口里数值的最大值。...例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下...第二个数字是3,比2大,所以2不可能是滑动窗口中的最大值,因此把2从队列里删除,再把3存入队列中。第三个数字是4,比3大,同样的删3存4。此时滑动窗口中已经有3个数字,而它的最大值4位于队列的头部。...但是我们怎样判断滑动窗口是否包括一个数字?应该在队列里存入数字在数组里的下标,而不是数值。...当一个数字的下标与当前处理的数字的下标之差大于或者相等于滑动窗口大小时,这个数字已经从窗口中滑出,可以从队列头部把它删除。因此,我们既有可能从头部删除数字,又可能从尾部删除数字,所以要双端队列。 ?

2.2K20

【算法】滑动窗口

在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。这样的操作在面对极大的数据量是,效率极低。...而滑动窗口法是维护两个指针来进行操作,通常情况下时间复杂度为O(N)。...那么我们可以试着用滑动窗口的方法来看看。 滑动窗口的方法通过一个for循环来达到目的,那问题又来了,for循环表示的是窗口的起始位置,还是终止位置?...以题目中的数组nums=[2,3,1,2,4,3],目标和target=7为例,来模拟一下滑动窗口的运行过程: 根据子序列和的大小不断调整滑动窗口的大小,当和小于target时,end++;当和大于等于...0:result; } 水果成篮 这个题目的大致意思就是要使得窗口里面只有两种数并且长度最长,可以使用滑动窗口来解决。

12310
领券