-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMaxValueOfSlidingWindow.java
More file actions
80 lines (56 loc) · 2.07 KB
/
MaxValueOfSlidingWindow.java
File metadata and controls
80 lines (56 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package swordPointOffer;
import java.util.LinkedList;
/**
* @Author: Wenhang Chen
* @Description:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
* <p>
* 示例:
* <p>
* 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
* 输出: [3,3,5,5,6,7]
* 解释:
* <p>
* 滑动窗口的位置 最大值
* --------------- -----
* [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
*
* <p>
* 提示:
* <p>
* 你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。
* @Date: Created in 10:02 4/30/2020
* @Modified by:
*/
public class MaxValueOfSlidingWindow {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || k < 1 || nums.length < k) {
return new int[0];
}
int index = 0;
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> qMax = new LinkedList<>();
for (int i = 0; i < nums.length; i++) {
// 在队列不为空的情况下,如果队列尾部的元素要比当前的元素小,或等于当前的元素
// 那么为了维持从大到小的原则,我必须让尾部元素弹出
while (!qMax.isEmpty() && nums[qMax.peekLast()] <= nums[i]) {
qMax.pollLast();
}
// 不走 while 的话,说明我们正常在队列尾部添加元素
qMax.addLast(i);
// 如果滑动窗口已经略过了队列中头部的元素,则将头部元素弹出
if (qMax.peekFirst() == (i - k)) {
qMax.pollFirst();
}
// 看看窗口有没有形成,只有形成了大小为 k 的窗口,我才能收集窗口内的最大值
if (i >= (k - 1)) {
res[index++] = nums[qMax.peekFirst()];
}
}
return res;
}
}