单调队列的学习 - 滑动窗口求最大/小值 (Leetcode 239, Sliding Window Maximum)

【C++】单调队列 详解 今天我们来讲一下单调队列与栈。 这两种数据结构虽然没有在c++的stl中有直接的实现,但是在做题过程中,很容易有单调队列(栈)的使用,尤其是在一些比较难的题目中。 目录单调队列1.1 单调队列介绍1.2 单调队列的应用1.2.1 滑动窗口最大值1.2.1.1 题目描述1.2.1.2 结题思路方法一(优先队列)方法二 (单调队列)1.3 单调队列的模拟实现1.4 其他例题 单调队列 1.1 单调队列介绍 单调队列 是 队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队 阅读详情

这几天在学习单调队列和单调栈,感觉下面几篇博客讲的比较好。
http://www.cnblogs.com/saywhy/p/6726016.html
http://dping26.blog.163.com/blog/static/17956621720139289634766/

单调队列不是真正的队列。因为队列都是FIFO的,统一从队尾入列,从对首出列。但单调队列是从队尾入列,从队首或队尾出列,所以单调队列不遵守FIFO。

  1. 对于单调(递增)队列,每次添加新元素时跟队尾比较,如果队尾元素值大于待入队元素,则将对尾元素从队列中弹出,重复此操作,直到队列为空或者队尾元素小于待入队元素。然后,再把待入队元素添加到队列末尾。
    单调递增是指从队首到队尾递增。举个例子[1,3,4,5],1是队首,5是队尾。
    单调(递减)队列与之类似,只是将上面的大,小两字互换。

2)单调(递增)队列可以用来求滑动窗口的最小值。同理,单调(递减)队列可以用来求滑动窗口的最大值。其算法复杂度都是O(n)。注意,如果我们用最小堆或是最大堆来维持滑动窗口的最大/小值的话,复杂度是O(nlogn),因为堆查询操作是O(1),但是进堆和出堆都要调整堆,调整的复杂度O(logn)。

  1. 单调队列还有用途是利用其滑动窗口最值优化动态规划问题的时间复杂度,比如可以利用单调队列优化多重背包的时间复杂度。下面是一个链接。
    https://www.cnblogs.com/BingweiHuang/p/15976681.html
  2. 单调队列和单调栈区别:

单调队列:

  1. 从尾部入队
  2. 把违反单调性的元素从尾部踢出
  3. 过期元素从头部踢出

单调栈:

  1. 从顶部入栈
  2. 把违反单调性的元素从顶部弹出
  3. 不过滤过期元素 //即单调队列的头部被堵死

单调队列如何实现呢? 以单调递增队列为例,我看到网上有些实现代码类似如下:

int q[maxn];
int front, tail, cur;
front = tail = 0;
while (front < tail && q[tail-1] > cur)
     --tail; 
q[tail++]=cur; 

单调递减队列类似,只是q[tail-1]元素的比较改为<即可。

上面的代码适用于求解固定查询区间尾部的RMQ问题(没有窗口大小的限制)。RMQ(x,y)就是询问数组[x,y]区间内部的最小值。如果y固定,那么可以用单调队列来求解。但实际上如果有滑动窗口的话,以上代码是不够的,因为窗口是有限的,所以当tail移动时,也会带动front移动,如果它们之间的距离超过了窗口大小的话。所以我们必须记得更新front。注意,单调队列的front和tail两个指针是不断往同一个方向移动的。

怎么更新呢? 我们必须保存队列中每个元素在原数组中的下标。我们可以把这些坐标保存在q[]中(注意上面的代码里面的q[]是保存的元素的值),然后a[q[i]]就是对应元素的值了。当我们发现head和tail所指向的数组元素的gap大于sliding window的大小时,就必须调整head了。

以单调递减队列求滑动窗口最大值为例,代码如下:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> vec(n, 0);
        int head = 0, tail = 0;
        vector<int> res;

        for (int i = 0; i < n; ++i) {
            while(head < tail && nums[vec[tail - 1]] < nums[i]) {
            //while(tail > 0 && nums[vec[tail - 1]] < nums[i]) {     //错误, 光tail>0不够,因为head可能等于tail,这里vec里面只有1个数据, tail-1就没有意义了。
                tail--;
            }
            vec[tail] = i;
            tail++;
          
            if (tail > 0 && vec[tail - 1] - vec[head] + 1 > k) head++;
            //if (head < tail && vec[tail - 1] - vec[head] + 1 > k) head++;     也可以
            //if (head < tail && i - vec[head] + 1 > k) head++;   也可以 
            if (i >= k - 1) {
                res.push_back(nums[vec[head]]);
            }
        }
        
        return res;
    }
};

有几点需要注意的地方:

  1. vec一开始就分配好,而不是空vector往里面push_back数据。
  2. head和tail都往增大的方向移动,tail永远>=head。 注意这里跟queue有点区别:queue是tail进队,head出队,而这里是tail进队也可以出队,head出队。
  3. 注意tail-1的用法,因为tail++。
  4. 调整head的时候一步就够了,但是因为tail-1,所以要加一个判断条件tail>0以防止刚开始的时候head就被调整。注意这里用head<tail也可以
  5. 如果我们要实现单调递减队列求sling window的最小值,则将上面的
 while(head < tail && nums[vec[tail - 1]] < nums[i]) {

改成

 while(head < tail && nums[vec[tail - 1]] > nums[i]) {

即可,其它不变。
5) 上面的算法还有优化空间。在

 while(head < tail && nums[vec[tail - 1]] < nums[i]) {

里面可以用binary search。因为是单调队列嘛。

下面讨论一下该算法的复杂度。上面的代码for循环里面又有while循环,看起来复杂度好像是O(nk),如果采用binary search来找也是O(nlogk)。但是我们换个角度想,每个元素最多入队一次,出队一次,所以出队入队操作一共2n个,这2n个操作平摊到n个元素中,所以复杂度实际上是O(k)。具体分析可以参考算法里面的amortized analysis。如果我们在while循环里面用binary search, 对于slidiing window很大的情况,可以加快点速度,但复杂度还是O(k)。

另外,单调队列也可以用deque实现。因为deque支持队尾和队头两边的出列和入列的操作。下面是用单调递减队列求滑动窗口最大值的代码:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        deque<int> dq;
        vector<int> res;

        for (int i = 0; i < n; ++i) {
            while(dq.size() > 0 && nums[dq.back()] < nums[i]) {
                dq.pop_back();
            }
            dq.push_back(i);
            if (i - dq.front() + 1 > k) dq.pop_front(); //也可以用if (dq.back() - dq.front() + 1 > k) dq.pop_front();
            if (i >= k - 1) res.push_back(nums[dq.front()]);
        }
        
        return res;
    }
};

注意:
1) 在pop_front()的操作中,必须逐一pop出front(),不能直接调整front的位置,因为会破坏deque内部的iterator。这里复杂度仍然是O(n),详见上面的amortized analysis。
2)用deque不用操心tail-1的问题,因为deque内部会处理。
3)若用单调递减队列求滑动窗口最小值,只需将下面while循环内的

     nums[dq.back()] < nums[i]

<改成>即可,其它不变。

下面是最经典的单调队列问题。
239. Sliding Window Maximum
You are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

Return the max sliding window.

Example 1:

Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [3,3,5,5,6,7]
Explanation:
Window position Max


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
Example 2:

Input: nums = [1], k = 1
Output: [1]
Example 3:

Input: nums = [1,-1], k = 1
Output: [1,-1]
Example 4:

Input: nums = [9,11], k = 2
Output: [11]
Example 5:

Input: nums = [4,-2], k = 2
Output: [4]

Constraints:

1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length

解法1:单调队列用数组vector实现。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        if (n < k) return {};
        vector<int> q(n, 0), res;
        int tail = 0, head = 0;
        
        for (int i = 0; i < n; ++i) {
            while (tail > head && nums[q[tail - 1]] < nums[i]) tail--;
            q[tail++] = i;
   
            if (i - q[head] + 1 > k) { //i is q[oldtail],也可以用q[tail-1]-q[head]+1>k
                head++;
            }
            if (i >= k - 1) res.push_back(nums[q[head]]);
        }
        
        return res;
    }
};

注意:

  1. 如果这里用数组的话,一定要分清head, tail和q[head], q[tail]的区别。
    q[head], q[tail]是原数组nums[]的坐标,它们的范围是0…n-1。
    head和tail是针对单调队列而言的,它们的范围是0…k-1。
    如果用deque,就省去了这些容易混淆的地方。
  2. 我们要分清楚这道题里面的两个数据结构,滑动窗口和单调栈。
    首先这两个东西的size不一样!
    滑动窗口size一开始会从1涨到k,然后就固定为k。
    而单调队列的size会一直在1到k之间变化,其值取决于输入数据的分布。
    (i - q[head] + 1 > k)表示单调队列的大小,i就是q[oldtail]的值,也可以用q[tail-1].
    另外,上面代码里面的tail和head是指对单调队列而言,不是滑动窗口的头和尾!

那么滑动窗口的头和尾怎么看呢?如果我们把最先插入的位置看成尾的话,那当i>=k-1后,滑动窗口的尾就是i, 其头部就是i-k+1的值,这样,其size恒为k。滑动窗口的头和尾的值都在0…n-1之间变化,一开始尾长到k-1,然后头尾顺序往右移动,尾-头的值恒为k。
3.

以input=[1,3,-1,-3,5,3,6,7,-1,6,8], 3 为例,如果我们在for循环内部最后加上下面的打印代码

 cout<<"i = "<<i<<" head="<<head<<" tail="<<tail-1<<" q[head]="<<q[head]<<" q[tail]="<<q[tail-1]<<"     ";
 for (int j = q[head]; j <= q[tail-1]; j++) cout << nums[j] << " ";
 cout << endl;

则输出为:
i = 0 head=0 tail=0 q[head]=0 q[tail]=0, 1
i = 1 head=0 tail=0 q[head]=1 q[tail]=1, 3
i = 2 head=0 tail=1 q[head]=1 q[tail]=2, 3 -1
i = 3 head=0 tail=2 q[head]=1 q[tail]=3, 3 -1 -3
i = 4 head=0 tail=0 q[head]=4 q[tail]=4, 5
i = 5 head=0 tail=1 q[head]=4 q[tail]=5, 5 3
i = 6 head=0 tail=0 q[head]=6 q[tail]=6, 6
i = 7 head=0 tail=0 q[head]=7 q[tail]=7, 7
i = 8 head=0 tail=1 q[head]=7 q[tail]=8, 7 -1
i = 9 head=0 tail=1 q[head]=7 q[tail]=9, 7 -1 6
i = 10 head=0 tail=0 q[head]=10 q[tail]=10, 8

每行后面即为单调队列的内容,前面是head,后面是tail。
可见i=4,5,6,7,8,10时,单调队列长度都不为3,但滑动窗口的大小固定为3。

最终结果为

[3,3,5,5,6,7,7,7,8]
  1. 在i循环中,i是单调队列tail的位置,也是滑动窗口tail的位置!。
  2. 与deque对应,q[head]=>deque.front(), q[tail]=>dq.back()。
    tail–对应dq.back(), q[tail++]=i对应dq.push_back(i)
    head++对应dq.pop_front()。

再解释一下上面为什么不能用

             if (tail - head > k) head++;   //old tail is tail - 1, (tail - 1) - head + 1 > k

替换

            if (i - q[head] + 1 > k) { //i is q[oldtail],也可以用q[tail-1]-q[head]+1>k
                head++;
            }

以[7,2,4], 2为例,假设我们把上面的head++都去掉,加上打印语句可得
i = 0 head=0 tail=0 q[head]=0 q[tail]=0 7
i = 1 head=0 tail=1 q[head]=0 q[tail]=1 7 2
i = 2 head=0 tail=1 q[head]=0 q[tail]=2 7 2 4 //不对,应该是4

可以看到,i=2时,tail实际上先–,然后再++,这个时候,整个单调队列的长度还是2 (内含元素是7, 4),但是它在原数组的跨度已经是3了 (7, 2, 4),这个时候我们应该以原数组上的跨度(i - q[head] + 1 > k)为准,所以应该head++ (此时,7已经过期,head指向4)。采用原数组的跨度的判断后,新的打印信息为
i = 0 head=0 tail=0 q[head]=0 q[tail]=0 7
i = 1 head=0 tail=1 q[head]=0 q[tail]=1 7 2
i = 2 head=1 tail=1 q[head]=2 q[tail]=2 4

解法2:单调队列用deque实现。

class Solution {
public:
    /**
     * @param nums: A list of integers.
     * @param k: An integer
     * @return: The maximum number inside the window at each moving.
     */
    vector<int> maxSlidingWindow(vector<int> &nums, int k) {
        int len = nums.size();
        vector<int> res;
        if (len < k) return res;
        deque<int> dq; //mono decreasing queue (from head to tail)
        for (int i = 0; i < len; ++i) {
            while (!dq.empty() && (nums[i] > nums[dq.back()])) {
                dq.pop_back();
            }
            dq.push_back(i);
            
            if (i - dq.front() == k) {  //不能用dq.size()>k,因为size()只是表示里面有多少元素,跟dq.back()-dq.front()没有关系。
            //if (dq.back() - dq.front() >= k) {  //也对,==k也对
                dq.pop_front();
            }
            
            if (i >= k - 1) {
                res.push_back(nums[dq.front()]);
            }
        }
        
        return res;
    }
};

单调队列解决滑动窗口问题 单调队列其实就是一个队列,只是使用了一点巧妙的方法使得队列中的元素全都是单调递增(或单调递减)的单调队列主要解决以下问题:给你一个数组window,已知其最值为A,如果给window中添加一个数B,那么比较一下A和B就可以立即算出新的最值;但如果要从window数组中减少一个数,就不能直接得到最值了,因为如果减少的这个数恰好是A,就需要遍历window中的所有元素重新寻找新的最值。针对这个问题我们可以用优先级队列解决吗?我们都知道优先级队列是一个特殊的队列,专门用来动态寻找最值得。 阅读详情

相关推荐

滑动窗口的最小值问题

滑动窗口的最小值问题 首先介绍一下什么是滑动窗口的最小值问题:输入正整数k和一个长度为n的整数序列A1-An。定义f(i)表示从元素i开始的连续k个元素的最小值,我们将k个元素的一个集合就称为一个“窗口”,计算f(i)和f(i+1)时,窗口滑动了一个位置。 (人家博客那里拿了一个图片过来) 问题的分析与解决方案 这个问题类似的问题其实我们早在前面的章节(8.5唯一的雪花那题,还有前面的前缀和问题)就已经或多或少地接触过了。 窗口在滑动地过程中,窗口的元素“出一个进一个”,也就是队列中删除一个添加一个进行

weixin_55835175的博客 1495

Leetcode单调队列、优先队列(堆)、单调栈、归并排序刷题总结

数据结构补充

studyForMokey的博客 1133

STM32CubeMX-电机控制2-电机相关配置部分

STM32CubeMX-电机霍尔传感器 写在前面的话:之前一直使用库函数,调程序时总会觉得是配置出现问题,要画一些时间去检查配置程序,所以目前转到了STM32CubeMX。写这些内容一方面是整理记录,因为是刚入门,所以难免出现错误,希望能得到大家指正;另一方面是因为自己一个人调试,走了很多弯路,写下来希望能给相同处境的人一些参考。 步骤一: 电机霍尔传感器接口 我目前使用的是STM32F4,电机的...

niker_co的博客 1万+

单调队列【总结】

一、基本概念 单调队列是指:单调递增或单调递减的队列。所以它也有如下几个性质: 1.队列中的元素在原来的列表中的位置是由前往后的(随着循环顺序入队)。 2.队列中元素的大小是单调递增或递减的。 3.从队尾入列,队首或队尾出列 时间复杂度:O(N) 二、例题 1.最大子序和(dp+单调队列优化) 题目描述 输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输入 第一行两

算法小猪的博客 2146

大数据课程综合实验案例:网站用户行为分析

大数据课程综合实验案例1 案例简介1.1 案例目的1.2 适用对象1.3 时间安排1.4 预备知识1.5 硬件要求1.6 软件工具1.7 数据集1.8 案例任务1.9 实验步骤2 本地数据上传到数据仓库Hive2.1 实验数据集的下载2.2 数据集的预处理(1)删除文件第一行记录,即字段名称(2)对字段进行预处理(3)导入数据库3 Hive数据分析3.1 操作Hive3.2 简单查询分析3.3 查询条数统计分析3.4 关键字条件查询分析3.4.1 以关键字的存在区间为条件的查询3.4.2 关键字赋予给定值为

weixin_44616879的博客 1万+

葵花 Himawari 8/9号数据学习记录-01-数据初识

葵花卫星学习记录,第一章:卫星的来源与卫星数据的波段介绍

weixin_44111909的博客 533

LeetCode 239. Sliding Window Maximum 题解

本题是单调队列的经典应用。使用双端队列维护单调递减序列队首是当前窗口的最大值及时移除不在窗口内和较小的元素。

cannonjinx的博客 2656

具身智能ACT模型在lerobot机械臂上的实践与优化

本文详细介绍了如何在低成本lerobot机械臂上实践与优化具身智能ACT模型。从环境搭建、数据采集到模型原理与代码实战,提供了完整的入门指南。重点分享了通过数据增强、混合开源数据集及模型微调等策略,有效提升模型在抓取放置任务中的泛化能力与鲁棒性,为机器人学习爱好者提供了宝贵的实战经验。

weixin_29081703的博客 167

LeetCode 239. 滑动窗口最大值(Sliding Window Maximum)

本题是滑动窗口与单调队列结合的经典题目。借助队列维护区间最大值,能将暴力 O(nk) 优化为 O(n)。常用于时间窗口、区间最大/最小值等类型问题。

2501_91641025的博客 559

Win11安装Office2021

windows11安装office2021。

1万+

别再对着ACF/PACF图发懵了!用R语言实战教你一眼分清AR、MA和ARMA模型

本文通过R语言实战详细解析了时间序列分析中AR、MA和ARMA模型的特征图识别技巧。重点讲解了如何通过ACF和PACF图的截尾与拖尾特征快速判断模型类型,帮助数据分析师建立从图形到模型的直觉映射,提升时间序列分析的效率和准确性。

weixin_28706923的博客 356

Leetcode 239. Sliding Window Maximum (python&c++)

Leetcode 239. Sliding Window Maximum题目:解法:deque实现的单调队列 题目: 解法:deque实现的单调队列 关于单调队列的解释:https://medium.com/algorithms-and-leetcode/monotonic-queue-explained-with-leetcode-problems-7db7c530c1d6 举个例子来说明单调队列,现在有个递减的单调队列[6,4,3]: 新元素为2,队列变为[6,4,3,2] 新元素为5,队列变为[6

qq_37821701的博客 471

1.14、基于NARX神经网络的磁悬浮建模(matlab)

数据准备:首先,需要准备用于训练和测试的磁悬浮系统的输入和输出数据,包括磁力、电流、位置、速度等信息。数据可以被保存在MATLAB的数据文件中,并加载到工作空间中。使用MATLAB的神经网络工具箱,创建一个NARX神经网络。需要定义网络的层次结构、节点数、激活函数等参数。通常,NARX网络包括自回归层和外部输入层。数据预处理:对加载的数据进行预处理,包括去除噪声、归一化处理等操作,以确保数据质量和网络训练的稳定性。使用MATLAB的训练函数,如trainlm或者trainbr,对NARX神经网络进行训练。

XU157303764的博客 1996

LeetCode 239.Sliding Window Maximum (滑动窗口最大值)

题目描述: 给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口k内的数字。滑动窗口每次只向右移动一位。 返回滑动窗口最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 ---...

amoscykl的博客 335

复现报告:《多回路人机控制系统仿真及II型PIO分析》方法复现与代码实现

本文复现了谭文倩硕士论文《多回路人机控制系统仿真及II型PIO分析》中的关键方法,重点实现了频域驾驶员模型辨识和参数灵敏度分析。通过数字化提取论文图表数据,构建了结构驾驶员模型传递函数,并验证了参数变化对系统特性的影响。采用MATLAB实现了描述函数计算、模型参数辨识和灵敏度分析算法,为后续神经网络模型辨识和II型PIO研究奠定了基础。由于缺乏原始实验数据,部分结果通过数值模拟获得,但仍有效重现了论文的核心分析方法。~~~~~

huanghm88的专栏 175

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode 239. Sliding Window Maximum C++ 单调队列

Problem 题目链接 Solution 题意为给定一个数组,给定一个长度为k滑动窗口,这个滑动窗口从数组最左边滑到数组最右边,每次滑动的时候,让你求位于滑动窗口内的数字的最大值。 此题最暴力的解法就是,枚举所有起点i,每次都从i开始遍历k个数字找出最大值,时间复杂度o(n^2) 如果利用单调队列,那么我们就可以把时间复杂度降到o(n) 单调队列的队首元素一定是当前滑动窗口内的最大值,整个单调队...

dong的博客 262

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode 239. Sliding Window Maximum(单调队列)

题目来源:https://leetcode.com/problems/sliding-window-maximum/ 问题描述 239.Sliding Window Maximum Hard Given an arraynums, there is a sliding window of sizekwhich is moving from the very left of the ...

da_kao_la的博客 292

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Leetcode】239. Sliding Window Maximum

这是一道很简单的单调队列的应用。单调队列简单的说,就是一种每次加元素的同时,要保持队列单调性的数据结构。本题基本思路是,维护一个双端队列,使得队列头就是当前滑动窗口的最大值,然后队列第二个数就是当前滑动窗口的次大数,以此类推。维护的方式是,每push一个数进去的时候,就把比该数小于等于的队列尾的数全pop出来,然后如果队首数字已经脱离了滑动窗口,也要pop出来。每次操作完后把队头的数加入最后结果,最后返回。,返回一个数组,每个数字代表原数组每。个数的滑动窗口的最大值。

数学、算法爱好者的博客 330

LeetCode_Queue_239. Sliding Window Maximum 滑动窗口最大值【优先队列,单调队列】【java】【中等】

滑动窗口最大值的优先队列和单调队列解法。队列原来这么好用!!!

&再见萤火虫&的博客 772

【leetcode】- 239. Sliding Window Maximum滑动窗口最大值 python版

滑动窗口最大值题目单调队列python代码 题目 Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Ret

。 334

LeetCode(239)-Sliding Window Maximum/返回滑动窗口最大值(双端队列)

题目: Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding wind...

Fly_Fly_Zhang的博客 450

leetcode 239. Sliding Window Maximum(滑动窗口最大值)

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window m...

蓝羽飞鸟的博客 216

[滑动窗口] leetcode 239 Sliding Window Maximum

problem:https://leetcode.com/problems/sliding-window-maximum/ 解法一:使用平衡二叉树(map), 时间复杂度 :O(N * log K) class Solution { public: vector<int> maxSlidingWindow(vector<int>...

ayzejx8547408的博客 115

leetcode239:Sliding Window Maximum(单调队列)

为了避免毕业后失业,还是要好好刷题,上次面试的时候问leetcode和剑指offer的比较多,去这里练习一下。 239. Sliding Window Maximum Hard 127477FavoriteShare Given an array nums, there is a sliding window of size k which is moving from the very ...

junior19的博客 349

LeetCode 239. Sliding Window Maximum (经典双端队列dequeue题目,附加动态规划解法)

LeetCode 239. Sliding Window Maximum: 没有见过的事物会让人恐惧,没有见过的数据结构会让人无所适从。一起来看看这道经典的双端队列题目吧,看看它是怎么让人如此熟悉却就是做不出来的。

tech_zwl的博客 618
上一篇: C++中的4种cast学习(dynamic_cast, static_cast, reinterpret_cast, const_cast)
下一篇: Uva 714 (抄书问题,二分查找+贪心)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值