Sliding Window Maximum
Problem
Given an array and a window size k, return an array containing the maximum value of each contiguous window as it slides from left to right.
Input
nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3Output
[3, 3, 5, 5, 6, 7]Maintain a deque of indices whose values are decreasing from front to back.
from collections import deque
def max_sliding_window(nums, k):
dq = deque()
out = []
for i, x in enumerate(nums):
while dq and dq[0] <= i - k:
dq.popleft()
while dq and nums[dq[-1]] < x:
dq.pop()
dq.append(i)
if i >= k - 1:
out.append(nums[dq[0]])
return out
function maxSlidingWindow(nums, k) {
const dq = [];
const out = [];
for (let i = 0; i < nums.length; i++) {
while (dq.length && dq[0] <= i - k) dq.shift();
while (dq.length && nums[dq[dq.length - 1]] < nums[i]) dq.pop();
dq.push(i);
if (i >= k - 1) out.push(nums[dq[0]]);
}
return out;
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> dq = new ArrayDeque<>();
int[] out = new int[nums.length - k + 1];
for (int i = 0; i < nums.length; i++) {
while (!dq.isEmpty() && dq.peekFirst() <= i - k) dq.pollFirst();
while (!dq.isEmpty() && nums[dq.peekLast()] < nums[i]) dq.pollLast();
dq.offerLast(i);
if (i >= k - 1) out[i - k + 1] = nums[dq.peekFirst()];
}
return out;
}
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> dq;
vector<int> out;
for (int i = 0; i < (int)nums.size(); i++) {
while (!dq.empty() && dq.front() <= i - k) dq.pop_front();
while (!dq.empty() && nums[dq.back()] < nums[i]) dq.pop_back();
dq.push_back(i);
if (i >= k - 1) out.push_back(nums[dq.front()]);
}
return out;
}