Skip to content

Commit cad55da

Browse files
committed
239. max sliding window
1 parent 9f3cc42 commit cad55da

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.util.Deque;
2+
import java.util.LinkedList;
3+
4+
/**
5+
* @author jiofeng
6+
* @date 2020/3/3
7+
*/
8+
public class MaxSlidingWindow {
9+
public static void main(String[] args) {
10+
// int[] nums = {1, 3, 1, 2, 0, 5};
11+
int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};
12+
// int[] nums = {1, -1};
13+
int[] res = new MaxSlidingWindowSolution().maxSlidingWindow(nums, 3);
14+
for (int num : res) {
15+
System.out.println(num);
16+
}
17+
}
18+
}
19+
20+
class MaxSlidingWindowSolution {
21+
public int[] maxSlidingWindow(int[] nums, int k) {
22+
if (nums.length == 0) {
23+
return new int[0];
24+
}
25+
Deque<Integer> deque = new LinkedList<>();
26+
// init deque
27+
for (int i = 0; i < k; i++) {
28+
putInDeque(deque, nums, i, k);
29+
}
30+
int[] resIndexes = new int[nums.length - k + 1];
31+
for (int i = k; i < nums.length; i++) {
32+
resIndexes[i - k] = deque.peekFirst();
33+
putInDeque(deque, nums, i, k);
34+
}
35+
// last one
36+
resIndexes[resIndexes.length - 1] = deque.peekFirst();
37+
// construct result
38+
int[] res = new int[nums.length - k + 1];
39+
for (int i = 0; i < resIndexes.length; i++) {
40+
res[i] = nums[resIndexes[i]];
41+
}
42+
return res;
43+
}
44+
45+
private void putInDeque(Deque<Integer> deque, int[] nums, int i, int k) {
46+
if (deque.isEmpty()) {
47+
deque.add(i);
48+
return;
49+
}
50+
// window is full
51+
if (i - deque.peekFirst() == k) {
52+
deque.pollFirst();
53+
}
54+
if (!deque.isEmpty() && nums[deque.peekFirst()] <= nums[i]) {
55+
deque.clear();
56+
}
57+
// poll the num in deque of loe num
58+
while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) {
59+
deque.pollLast();
60+
}
61+
deque.add(i);
62+
}
63+
}

0 commit comments

Comments
 (0)