Sliding Window Maximum
Problem
Given an array of n integer with duplicate number, and a moving window(size k), move the window at each iteration from the start of the array, find the maximum number inside the window at each moving.
Example
For array [1, 2, 7, 7, 8]
, moving window size k = 3
. return [7, 7, 8]
At first the window is at the start of the array like this
[|1, 2, 7| ,7, 8] , return the maximum 7;
then the window move one step forward.
[1, |2, 7 ,7|, 8], return the maximum 7;
then the window move one step forward again.
[1, 2, |7, 7, 8|], return the maximum 8;
Challenge
o(n) time and O(k) memory
Solution
public class Solution {
public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) {
Deque<Integer> dq = new ArrayDeque<>();
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (!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) res.add(nums[dq.peekFirst()]); //从k-1开始,每一次循环都将队首元素加入结果数组
}
return res;
}
}
Sliding Window Median
Problem
Given an array of n integer, and a moving window(size k), move the window at each iteration from the start of the array, find the median of the element inside the window at each moving. (If there are even numbers in the array, return the N/2-th number after sorting the element in the window. )
Example
For array [1,2,7,8,5], moving window size k = 3. return [2,7,7]
At first the window is at the start of the array like this
[ | 1,2,7 | ,8,5] , return the median 2;
then the window move one step forward.
[1, | 2,7,8 | ,5], return the median 7;
then the window move one step forward again.
[1,2, | 7,8,5 | ], return the median 7;
Challenge
O(nlog(n)) time