leetcode59题:滑动窗口的最大值(用双端队列实现)
题目描述:
给定一个数组 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题:滑动窗口的最大值(用双端队列实现)相关推荐
- LeetCode 239. 滑动窗口最大值(双端队列+单调栈)
文章目录 1. 题目信息 2. 解题 2.1 暴力法 2.2 双端队列法 1. 题目信息 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内 ...
- 剑指offer:滑动窗口的最大值(栈和队列)
1. 题目描述 /*给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{ ...
- [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]
[问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...
- leetcode算法题--滑动窗口的最大值
原题链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 滑动窗口: vector<int> ...
- java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...
- (笔试题)滑动窗口的最大值
题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- 牛客题霸 [滑动窗口的最大值] C++题解/答案
牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...
- [剑指offer]面试题第[59-1]题[Leetcode][第239题][JAVA][滑动窗口的最大值][单调队列][优先队列]
[问题描述][困难] [解答思路] 1. 暴力 两层 for 循环,每次都从窗口中找最大值即可 时间复杂度:O(N^2) 空间复杂度:O(N) public int[] maxSlidingWindo ...
最新文章
- Queue接口中add()与offer(),remove()与poll(),element()与peek()方法区别
- 酷!GitHub开发者自研火星车,开发教程全面开源
- .Net Core Razor 预编译,动态编译,混合编译
- IE8下utf-8编码页面乱码问题解决办法
- 哔哩哔哩公布2021年度弹幕:“破防了”
- 【实用代码片段】将json数据绑定到html元素 (转)
- matplotlib,seaborn等画图工具
- mysql 自动加上编号
- 字段分行加一 sql语句
- python编写水仙花数
- 协同oa办公系统在线演示下载地址
- Hypermesh软件初学
- Shadow-插件化框架分析
- 粒子群优化算法(PSO)附代码
- linux下查询utp命令,Linux后台下载工具(器)transmission 使用详解
- 图像的旋转——imrotate
- 电平转换电路的分析-MOS管、三极管
- 《摔跤吧爸爸》观后感
- 教程08-微擎系统内置所有函数大全
- 【黑苹果装机实践】从硬件选择到系统安装