给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7

示例 2:

输入:nums = [1], k = 1
输出:[1]

示例 3:

输入:nums = [1,-1], k = 1
输出:[1,-1]

示例 4:

输入:nums = [9,11], k = 2
输出:[11]

示例 5:

输入:nums = [4,-2], k = 2
输出:[4]

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4
  • 1 <= k <= nums.length

解答

第一想法是参照480. 滑动窗口中位数中采用优先队列的解法,按理说复杂度也是o(n)级别的,但是只超过了5%:

class Solution {public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;if(k > nums.size())return result;// 大顶堆priority_queue<int> q;for(int i = 0; i < k; i++){q.push(nums[i]);}unordered_map<int, int> m;int i = k;while(true){result.push_back(q.top());if(i >= nums.size())break;int num_in = nums[i];int num_out = nums[i - k];i += 1;m[num_out] += 1;q.push(num_in);// 只有当需要弹出的数字尾栈顶时才真正出栈while(m[q.top()]){m[q.top()] -= 1;q.pop();}}return result;}
};

参照官方的解法,用时也差不多:

class Solution {public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;priority_queue<pair<int, int>> q;for(int i = 0; i < k; i++){q.emplace(nums[i], i);}result.push_back(q.top().first);for(int i = k; i < nums.size(); i++){q.emplace(nums[i], i);while(q.top().second <= i - k){q.pop();}result.push_back(q.top().first);}return result;}
};

还可以使用双向队列维护窗口,实际上并不需要维护一个完整的长度为k的窗口,而只需要维护窗口k长度内的一个单调递减序列(单调栈)即可,这样队列头部就是最大的数字:

class Solution {public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;deque<int> q;for(int i = 0; i < nums.size(); i++){// 超过窗口长度,出栈if(!q.empty() && q.front() == i - k)q.pop_front();// 单调递减序列while(!q.empty() && nums[q.back()] < nums[i])q.pop_back();q.push_back(i);if(i >= k - 1){result.push_back(nums[q.front()]);}}return result;}
};

239. 滑动窗口最大值相关推荐

  1. 【LeetCode】【HOT】239. 滑动窗口最大值(双向队列)

    [LeetCode][HOT]239. 滑动窗口最大值 文章目录 [LeetCode][HOT]239. 滑动窗口最大值 package hot;import java.util.Arrays; im ...

  2. Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素

    day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...

  3. 单调区间之239.滑动窗口最大值

    单调区间 239. 滑动窗口最大值 这个题如果用普通的优先队列是有问题的,因为每次弹出去的不知道是上一个窗口的左边界还是这个窗口里的元素.我们要的是每次只弹出上一个窗口的左边界并且还能弹出最值,所以这 ...

  4. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

    一.239. 滑动窗口最大值 from collections import dequeclass MyQueue: #单调队列(从大到小def __init__(self):self.queue = ...

  5. 力扣239. 滑动窗口最大值(自定义排序队列)

    239. 滑动窗口最大值 //实现功能:peek()取得队列的最大值,比最大值先添加进来的删除,后添加进来的保留 class Mydeque{Deque<Integer> deque;pu ...

  6. LeetCode 239:滑动窗口最大值 思考分析

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进阶: 你能在线性 ...

  7. leetcode 239. 滑动窗口最大值(单调队列)

    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例 1: 输 ...

  8. LeetCode 239. 滑动窗口最大值(双端队列+单调栈)

    文章目录 1. 题目信息 2. 解题 2.1 暴力法 2.2 双端队列法 1. 题目信息 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内 ...

  9. 面试题59 - I. 滑动窗口的最大值/239. 滑动窗口最大值

    2020-05-11 1.题目描述 滑动窗口的最大值 2.题解 使用双端队列维护一个递减的队列 3.代码 class Solution { public:vector<int> maxSl ...

最新文章

  1. bitnami-redmineserver迁移
  2. 解决WAS报错SRVE0207E: servlet 创建了未捕获到的初始化异常
  3. GD32的flash读、擦除、写操作
  4. ASP.NET Core quot;完整发布,自带运行时quot; 到jexus
  5. google浏览器 隐藏功能开启
  6. DNS服务的配置与管理(4) 配置其它类型的DNS记录
  7. Multisim 14.0安装包+详细安装步骤
  8. php对照表,编码对照表的使用(1)-PHP教程,PHP应用
  9. 验证离散数学中的关系的相关性质(自反性,对称性,反自反性,发对称性,传递性)通过关系矩阵的方法
  10. 吊炸天SpringBoot接入支付宝支付【附关键代码】
  11. HTML5期末大作业:游戏设计网站设计——游戏介绍(5页) 大学生游戏网页设计作业模板下载 网游网页设计作业成品 静态HTML手游网页制作下载_网页设计代码
  12. 计算机重启 ie 被改,ie被修改怎么办 ie被修改的解决方法【详解】
  13. Codeforces 833D Red-Black Cobweb 边分治
  14. java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)问题解决,很详细,很详细,很详细
  15. [机器学习与scikit-learn-4]:scikit-learn机器学习的一般流程与案例演示
  16. 计算机音乐花之舞谱,花之舞钢琴谱
  17. 视频业务基础知识入门
  18. 灌装机的灌装结构设计及仿真(lunwen+任务书+开题+文综+翻译及原文+答辩PPT+cad图纸+UG模型及运动仿真)
  19. aot android,android – JIT与AOT编译
  20. 分布式定时任务调度系统

热门文章

  1. 用计算机术语赞美老师,赞美老师的诗句 形容老师辛苦的诗句
  2. 关于MFC模态对话框dlg.DoModal()返回-1的可能原因
  3. Synaptic Ubuntu软件管理工具
  4. Android 备忘录模式
  5. c语言结账程序设计,c语言餐饮结账管理系统设计.doc
  6. 解决“ValueError: Unknown resampling filter (107). Use Image.NEAREST (0), Image.LANCZOS (1), Image.BIL”
  7. 【市场点评】沪深基指终强势反弹 终结六连阴走势
  8. 解决No tf data. Actual error: Fixed Frame [world] does not exist错误
  9. 回收站是计算机硬盘,如何查找移动硬盘回收站
  10. JAVA带财务进销存ERP管理系统源码,免费分享源码