Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解
题目链接
https://leetcode-cn.com/problems/sliding-window-maximum/
题目内容
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 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 |
分析
1、创建一个双端队列用来存储nums数组中元素的索引;
2、创建一个结果数组存储达到窗口大小时,在窗口内的元素;
3、没达到窗口大小时:如果双端队列是空的,那么直接从队尾插入元素的索引,如果双端队列不为空,需要保证双端队列中的索引在nums中的值是递减的。达到窗口大小时,直接将双端队列的头部元素在nums中的值存储到结果数组。
如图:
先放动态图:
再放静态图;
代码
import jdk.jshell.spi.ExecutionControl;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length<=0)
throw new RuntimeException("nums是空的!");
//创建双端队列
Deque<Integer> deque = new LinkedList<>();
//创建一个结果的ArrayList
ArrayList<Integer> resut_array = new ArrayList<>();
for(int i=0;i<nums.length;i++){
//如果双端队列不为空,而且到了窗口长度
if(!deque.isEmpty() && deque.peek() == i-k)
//移除第一个元素
deque.pollFirst();
//保证nums【双端队列中的索引】是一个递减数列
while(!deque.isEmpty() && nums[deque.getLast()] < nums[i])
deque.pollLast();
//把当前元素的索引加到双端队列中
deque.offer(i);
//如果是窗口大小
if(i >= k-1)
resut_array.add(nums[deque.peek()]);
}
//ArrayList转换成整型数组
int[] res = resut_array.stream().mapToInt(Integer::intValue).toArray();
return res;
}
}
欢迎关注
欢迎大家的关注
扫描下方的二维码关注我的微信公众号:code随笔
Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解的更多相关文章
- [Swift]LeetCode239. 滑动窗口最大值 | Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
- 【LeetCode】480. 滑动窗口中位数 Sliding Window Median(C++)
作者: 负雪明烛 id: fuxuemingzhu 公众号: 每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,中位数,multiset,刷题群 目录 题目描述 题目大意 解题方 ...
- 滑动窗口(Sliding Window)技巧总结
什么是滑动窗口(Sliding Window) The Sliding Problem contains a sliding window which is a sub – list that run ...
- 数据流滑动窗口平均值 · sliding window average from data stream
[抄题]: 给出一串整数流和窗口大小,计算滑动窗口中所有整数的平均值. MovingAverage m = new MovingAverage(3); m.next(1) = 1 // 返回 1.00 ...
- 【leetcode】239. 滑动窗口最大值
目录 题目 题解 三种解法 "单调队列"解法 新增.获取最大值 删除 代码 题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以 ...
- LeetCode编程训练 - 滑动窗口(Sliding Window)
滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...
- Java实现 LeetCode 239 滑动窗口最大值
239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最 ...
- Leetcode 239.滑动窗口最大值
滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: ...
- LeetCoded第239题题解--滑动窗口最大值
滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进 ...
随机推荐
- 33)new和delete关键字
---------------------------------------------------------------------------------------------------- ...
- 12)PHP,常量和魔术常量
义:用于存储一个不会变化也不希望变化的数据的标示符. 常量命名规则,同变量,但习惯说,常常将常量的名称使用“全大写”形式. 定义形式 使用define()函数定义 使用形式:define(“常量名”, ...
- 17.3.16---python内建函数
内置函数,无需import,任何时候都可以直接被使用 1------ Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍 ...
- linux中cd / cd~ cd cd- 和cd..之间的区别
cd 进入用户主目录 cd ~ 进入用户主目录 cd - 返回进入此目录之前所在目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 ...
- 自定义View淡出动画
//AllGestureView为自定义view AllGestureView *gestureView=[[AllGestureView alloc]init]; gestureView.frame ...
- socker通信-struct模块-粘包问题
Socket概念 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对 ...
- iOS之正则表达式(一)
这几天研究正则表达式发现正则表达式真是个好东西,可以在支付的时候轻松匹配交易数额,入门内容以及匹配如下: @interface ViewController () @property (weak, n ...
- bat文件设置ip自动和静态ip切换
下载地址:https://i.cnblogs.com/Files.aspx win10系统: @echo off cd /d %~dp0 %1 start "" mshta vbs ...
- Graylog
Graylog #Graylog 是与 ELK 可以相提并论的一款集中式日志管理方案,支持数据收集.检索.可视化 #Graylog 架构 - Graylog 负责接收来自各种设备和应用的日志,并为用 ...
- E - Apple Tree(树状数组+DFS序)
There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...