Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

时间:2023-03-09 19:33:55
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中的值存储到结果数组。

如图:

先放动态图:

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

再放静态图;

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

代码

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语言求解