Skip to content

Commit 88611d4

Browse files
committed
SlidingWindowMaximum
1 parent 93ae54c commit 88611d4

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package popular;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Arrays;
5+
import java.util.Deque;
6+
7+
public class SlidingWindowMaximum {
8+
9+
public int[] maxSlidingWindow(int[] nums, int k) {
10+
if (nums == null || nums.length == 0 || k <= 0) {
11+
return new int[0];
12+
}
13+
int len = nums.length;
14+
int[] windowMaxArray = new int[len - k + 1];
15+
int[] leftMaxArray = new int[len];
16+
int[] rightMaxArray = new int[len];
17+
18+
int rightIndex;
19+
for (int i = 0; i < len; i++) {
20+
leftMaxArray[i] = i % k == 0 ? nums[i] : Math.max(leftMaxArray[i - 1], nums[i]);
21+
rightIndex = len - i - 1;
22+
rightMaxArray[rightIndex] = (i == 0 || (rightIndex + 1) % k == 0) ? nums[rightIndex] : Math.max(rightMaxArray[rightIndex + 1], nums[rightIndex]);
23+
}
24+
25+
for (int j = 0; j <= len - k; j++) {
26+
windowMaxArray[j] = Math.max(leftMaxArray[j + k - 1], rightMaxArray[j]);
27+
}
28+
29+
return windowMaxArray;
30+
}
31+
32+
public int[] maxSlidingWindowWithDeque(int[] nums, int k) {
33+
if (nums == null || nums.length == 0 || k <= 0) {
34+
return new int[0];
35+
}
36+
int len = nums.length;
37+
int[] windowMax = new int[len - k + 1];
38+
int windowIndex = 0;
39+
// store index
40+
Deque<Integer> deque = new ArrayDeque<>();
41+
for (int i = 0; i < len; i++) {
42+
// remove numbers out of range k
43+
while (!deque.isEmpty() && deque.peek() < i - k + 1) {
44+
deque.poll();
45+
}
46+
// remove smaller numbers in k range as they are useless
47+
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
48+
deque.poll();
49+
}
50+
// deque contains index... r contains content
51+
deque.offer(i);
52+
53+
if (i + 1 >= k) {
54+
windowMax[windowIndex++] = nums[deque.peek()];
55+
}
56+
}
57+
58+
return windowMax;
59+
}
60+
61+
public static void main(String[] args) {
62+
int[] nums = {1,3,-1,-3,5,3,6,7};
63+
int k = 3;
64+
SlidingWindowMaximum obj = new SlidingWindowMaximum();
65+
//int[] windowMax = obj.maxSlidingWindow(nums, k);
66+
int[] windowMax = obj.maxSlidingWindowWithDeque(nums, k);
67+
System.out.println("Output: " + Arrays.toString(windowMax));
68+
}
69+
70+
71+
72+
}

0 commit comments

Comments
 (0)