Note: This question is very similiar to Median from Data Stream
class Solution { public double[] medianSlidingWindow(int[] nums, int k) { if (nums.length == 0) return new double[0]; LinkedList<Double> window = new LinkedList<>(); PriorityQueue<Double> maxQueue = new PriorityQueue<>(Collections.reverseOrder()); PriorityQueue<Double> minQueue = new PriorityQueue<>(); double[] result = new double[nums.length - k + 1]; int index = 0; for (int num : nums) { window.offer((double)num); maxQueue.offer((double)num); minQueue.offer(maxQueue.poll()); if (maxQueue.size() < minQueue.size()) maxQueue.offer(minQueue.poll()); if (window.size() > k) { double out = window.pollFirst(); if (!maxQueue.remove(out)) { minQueue.remove(out); minQueue.offer(maxQueue.poll()); } } if (maxQueue.size() < minQueue.size()) maxQueue.offer(minQueue.poll()); if (window.size() == k) { result[index++] = maxQueue.size() == minQueue.size() ? (minQueue.peek() + maxQueue.peek()) / 2.0 : maxQueue.peek(); } } return result; } }