题目描述:

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

输入: 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       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

思路分析:

考虑到这道题的数组要求可以头部进去、删除,尾部进去,删除,所以使用双端队列Deque。使用双端队列的单调双端队列LinkedList实现。

所谓的单调,就是我们人为规定从队列的头部到尾部,所存储的元素是依次递减(或依次递增)的。

也就是说,我们维护一个单调的双向队列,窗口在每次滑动的时候,我就从队列头部取当前窗口中的最大值,每次窗口新进来一个元素的时候,我就将它与队列中的元素进行大小比较:

如果刚刚进来的元素比队列的尾部元素大,那么先将队列尾部的元素弹出,然后把刚刚进来的元素添到队列的尾部;
如果刚刚进来的元素比队列的尾部元素小,那么把刚刚进来的元素直接添到队列的尾部即可。

因此,通过这种既能从头部进出,又能从尾部进出的结构,来维持窗口的最大值的。

java代码:

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {Deque<Integer> deque=new LinkedList<>();int len=nums.length;if(len==0 ||k==0 ){return new int[0] ;}int[] res=new int[len-k+1];for(int i=0;i<k;i++){while(!deque.isEmpty() && nums[i]>deque.peekLast()){deque.removeLast(); //比队列元素大就弹出队尾数据}deque.addLast(nums[i]);//不走循环直接加到队列末尾}res[0]=deque.peekFirst();for(int i=k;i<len;i++){// 如果滑动窗口已经略过了队列中头部的元素,则将头部元素弹出if(deque.peekFirst() == nums[i - k]){deque.removeFirst();//}while(!deque.isEmpty() && deque.peekLast() < nums[i]){deque.removeLast();}deque.addLast(nums[i]);res[i - k + 1] = deque.peekFirst();}return res;}
}

leetcode59题:滑动窗口的最大值(用双端队列实现)相关推荐

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

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

  2. 剑指offer:滑动窗口的最大值(栈和队列)

    1. 题目描述 /*给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{ ...

  3. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]

    [问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...

  4. leetcode算法题--滑动窗口的最大值

    原题链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 滑动窗口: vector<int> ...

  5. java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...

  6. (笔试题)滑动窗口的最大值

    题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  7. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  8. 牛客题霸 [滑动窗口的最大值] C++题解/答案

    牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...

  9. [剑指offer]面试题第[59-1]题[Leetcode][第239题][JAVA][滑动窗口的最大值][单调队列][优先队列]

    [问题描述][困难] [解答思路] 1. 暴力 两层 for 循环,每次都从窗口中找最大值即可 时间复杂度:O(N^2) 空间复杂度:O(N) public int[] maxSlidingWindo ...

最新文章

  1. Queue接口中add()与offer(),remove()与poll(),element()与peek()方法区别
  2. 酷!GitHub开发者自研火星车,开发教程全面开源
  3. .Net Core Razor 预编译,动态编译,混合编译
  4. IE8下utf-8编码页面乱码问题解决办法
  5. 哔哩哔哩公布2021年度弹幕:“破防了”
  6. 【实用代码片段】将json数据绑定到html元素 (转)
  7. matplotlib,seaborn等画图工具
  8. mysql 自动加上编号
  9. 字段分行加一 sql语句
  10. python编写水仙花数
  11. 协同oa办公系统在线演示下载地址
  12. Hypermesh软件初学
  13. Shadow-插件化框架分析
  14. 粒子群优化算法(PSO)附代码
  15. linux下查询utp命令,Linux后台下载工具(器)transmission 使用详解
  16. 图像的旋转——imrotate
  17. 电平转换电路的分析-MOS管、三极管
  18. 《摔跤吧爸爸》观后感
  19. 教程08-微擎系统内置所有函数大全
  20. 【黑苹果装机实践】从硬件选择到系统安装

热门文章

  1. ASP.NET MVC 4 内容映射
  2. webserver 交互方式说明
  3. sass调试--页面看到sass文件而不是css文件问题
  4. UI基础之UITableView案例QQ聊天界面
  5. JavaScript高级程序设计之EventUtil
  6. Oracle11g数据库监听配置
  7. 页面头部title、description、keywords标签的优化
  8. 转的:SQL执行提高效率的多种方法
  9. linux的进程栈和线程栈
  10. zabbix mysql安装配置_ZABBIX4.4 安装及配置