int[] nums = {1,3,-1,-3,5,3,6,7}; int k = 3; // Sliding window maximum output array int[] result = slidingWindowMaximum(nums, k); System.out.println(Arrays.toString(result)); // Assume slidingWindowMaximum is implemented correctly using deque
The sliding window maximum for each window of size 3 is calculated as follows:
- Window [1,3,-1] max is 3
- Window [3,-1,-3] max is 3
- Window [-1,-3,5] max is 5
- Window [-3,5,3] max is 5
- Window [5,3,6] max is 6
- Window [3,6,7] max is 7
So the output array is [3, 3, 5, 5, 6, 7].
Deque allows adding and removing elements from both ends in constant time. We use it to keep indexes of elements in decreasing order of their values. This way, the front of the deque always holds the index of the maximum element for the current window.
Deque<Integer> dq = new LinkedList<>(); int[] nums = {4, 3, 5, 4, 3, 3, 6, 7}; int k = 3; for (int i = 0; i < nums.length; i++) { while (!dq.isEmpty() && nums[dq.peekLast()] < nums[i]) { dq.pollLast(); } dq.addLast(i); if (dq.peekFirst() <= i - k) { dq.pollFirst(); } if (i >= k - 1) { System.out.print(nums[dq.peekFirst()] + " "); } }
The condition if (dq.peekFirst() <= i - k) should be while (dq.peekFirst() <= i - k) or at least checked carefully. Using if here can cause old indexes to remain in the deque, leading to incorrect maximum values.
int[] nums = {2, 1, 3, 4, 6, 3, 8, 9, 10, 12, 56}; int k = 4; Deque<Integer> dq = new LinkedList<>(); for (int i = 0; i < nums.length; i++) { while (!dq.isEmpty() && nums[dq.peekLast()] < nums[i]) { dq.pollLast(); } dq.addLast(i); if (dq.peekFirst() <= i - k) { dq.pollFirst(); } if (i >= k - 1) { System.out.print(nums[dq.peekFirst()] + " "); } }
In Java, the condition of a while loop must be enclosed in parentheses. Option B misses parentheses around the condition, causing a syntax error.
The deque-based algorithm processes each element once, maintaining a structure to get maximum in O(1) time per window, resulting in O(n) total time. Other methods are slower or use more memory.
