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

滑动窗口最大值

滑动窗口最大值 给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。...示例 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 -------------...我们可以通过维护一个单调递减的窗口来实现,当向右移动时左侧超出窗口的值弹出,因为需要的是窗口内的最大值,所以只要保证窗口内的值是递减的即可,即小于新加入的值全部弹出,最左端即为窗口最大值。...首先我们定义一个用来存储递减值的下标的窗口,以及存储最大值的组,之后循环给定的数组,如果当前遍历的数组值下标大于窗口大小并且递减下标窗口的第一个值是小于当前窗口,即第一个值在当前需要组合的窗口之外,就将其弹出...,之后从后向前遍历,如果递减窗口存在值且其中的值小于即将要加入的值就将其弹出,此时将当前遍历的值的下标加入递减窗口,最后如果窗口能够组合成k个就开始取最大值即递减窗口的第一个值,将其加入最大值组,循环结束后返回即可

65510

滑动窗口最大值

堆和双向队列 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。...返回滑动窗口中的最大值。...这道题有两种解法,一种是使用大顶堆,一种是使用双向队列 方法一: 使用大顶堆,维护一个长度为k的大顶堆,存放的每个元素为一个数对,分别为数值和下标,每次加入新元素,然后把超出窗口的元素删除,怎么算超出窗口呢...,也就是下表位于窗口左边界左侧的,如果当前下标为i,那么左边界就是i-k+1。...同时排除掉队头超过窗口边界的元素,下标不符合范围的出队 class Solution { public: vector maxSlidingWindow(vector& nums

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

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

    ,找出所有滑动窗口里数值的最大值。...例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下...解题思路 方法一:蛮力法 思路 扫描窗口k,得到最大值。对于长度为n的数组,算法时间复杂度O(nk) 显然不是最优解。...第二个数字是3,比2大,所以2不可能是滑动窗口中的最大值,因此把2从队列里删除,再把3存入队列中。第三个数字是4,比3大,同样的删3存4。此时滑动窗口中已经有3个数字,而它的最大值4位于队列的头部。...0位置上或者之后(窗口是完整大小的),才计算窗口的有效最大值 if(begin>=0){ // 永远是队列最左边最大,加入结果集

    2.2K20

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

    滑动窗口最大值 难度困难2154收藏分享切换为英文接收动态反馈 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。...滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。...示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 ----------...,如果这个窗口很大,那么时间复杂度是非常高的,因为遍历一遍这个窗口获取最大值的时间复杂度是 O(k),而我们还得去遍历这个数组的元素,那么总和起来就是 O(n*k),这样子在这道题是会超时的!...1、队列维护数组下标 滑动窗口最大值 | 图解单调队列 | 最清晰易懂的讲解【c++/java】 ​ ⚜️为什么要维护数组的下标呢❓❓❓ ​ 因为每次我们需要去控制这个窗口移动,并保持让队列中的元素都落于这个窗口

    50820

    滑动窗口最大值(LeetCode 239)

    你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值 。...4.解题思路 方法一:暴力法 遍历所有的滑动窗口,通过遍历窗口内的所有值获取窗口最大值。 那一共有多少个滑动窗口呢,小学题目,一共可以得到 n-k+1 个滑动窗口。...我们可以构建维护一个大顶堆,堆顶元素就是滑动窗口中的最大值。每一次窗口滑动的时候,我们都需要将新进入窗口的元素加到堆中。...我们可以通过一个单调队列保存当前窗口最大值以及「在窗口最大值后面递减的值」。 为了便于判断队首元素是否超出窗口范围,所以队列中保存数组元素下标。 首先初始化第一个窗口对应的单调队列。...滑动窗口最大值

    14010

    golang刷leetcode 滑动窗口(8)滑动窗口最大值

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。 返回滑动窗口最大值。...示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 ---...解题思路: 1,滑动窗口+大根堆,行不通,因为窗口左边元素移出窗口的时候,不知道在堆上的位置,且会损坏堆 2,双端队列(队列内部元素降序) A,如果当前元素大于队首元素,说明前面还在窗口中的元素没有意义了...(不是最大值),清空队列,把元素放到队首 B,如果队列已满,移出队首元素(为了方便判断,队列中存数组下标) 3,队列未满或者2.B这种情况: A,如果当前元素小于队尾元素,则,将当前元素放到队尾(以后可能是最大值...) B,如果当前元素大于队尾元素,将队尾元素弹出(不可能是最大值了),直到当前元素小于队尾元素,将当前元素放到队尾 4,注意边界情况: 如果当前元素<队首元素&&队列已满 弹出队首元素后,当前元素可能在队首

    48320

    【算法实战】生成窗口最大值数组

    显然,对于这道题用暴力法来做还是挺简单了,窗口每次向右移动一位时,我们每次遍历窗口内的w个元素,然后求出此时窗口最大值就可以了,用这种方法的时间复杂度是 O(wn)。...显然,max=5左边的窗口实际上是不必再遍历的了,也就是它不可能会是窗口最大值。 而 max = 5 右边的 4 有可能会是窗口最大值吗?...由于窗口还会一直向右移动,所以 max = 5 右边的窗口元素还是有可能是某一个窗口最大值的。 因此,我们可以用一个双向的队列,来记录有可能成为窗口最大值的下标,注意,这里指的是有可能。...像刚才的 max = 5 前面的 1,3 就不可能成为窗口最大值了,而右边的4还是有可能成为窗口最大值的。...并且这个队列是有序的,队首存放的总是队列中的最大值, 我以这道题来演示一下,我们用result[] 数组来存放窗口最大值。 1、result[0] = 5 ? 2、result[1] = 5; ?

    1.4K20

    滑动窗口最大值

    问题描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。 你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。...示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7]  解释:    滑动窗口的位置                最大值 -...解题思路 最直观的做法是在滑动窗口时每次遍历一次窗口中的 k 个数取最大值,算法复杂度为 O(n x k) 使用双端队列可以将复杂度降为 O(n) (1)遍历数组,每次从队尾添加元素,注意这里添加到队列的是数组的下标不是数组的值...,则移除队头 import java.util.Deque; import java.util.LinkedList; /** * 239、滑动窗口最大值 * https://leetcode-cn.com...deque.removeLast(); } // 将当前数加入队尾 deque.addLast(i); // 当前窗口最大值

    47710

    漫画:滑动窗口系列 第一讲(滑动窗口最大值

    02 第239题:滑动窗口最大值 第239题:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。...返回滑动窗口中的最大值。 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。...返回滑动窗口中的最大值所构成的数组。...我们很容易想到,可以通过遍历所有的滑动窗口,找到每一个窗口最大值,来进行暴力求解。那一共有多少个滑动窗口呢,小学题目,可以得到共有 L-k+1 个窗口。...),在整个遍历的过程中我们再记录下每一个窗口最大值到结果数组中。

    53540
    领券