Method 1 Two Heap
class Solution {
private int windowSize;
private PriorityQueue<Integer> larger;
private PriorityQueue<Integer> smaller;
public double[] medianSlidingWindow(int[] nums, int k) {
this.windowSize = k;
this.smaller = new PriorityQueue<>(Collections.reverseOrder());
this.larger = new PriorityQueue<>();
double[] result = new double[nums.length - k + 1];
for (int i = 0; i < nums.length; i++) {
if (i >= k) { // delete start (k + 1)th
this.delete(nums[i - k]);
}
this.insert(nums[i]); // insert start 0th
if (i >= k -1) { // record result start kth
result[i - k + 1] = this.findMedian();
}
}
return result;
}
private void insert(int num) {
if (this.smaller.isEmpty() || num <= this.smaller.peek()) {
this.smaller.offer(num);
}
else {
this.larger.offer(num);
}
rebalance();
}
private void delete(int num){
if (num <= this.smaller.peek()) {
this.smaller.remove(num);
}
else {
this.larger.remove(num);
}
rebalance();
}
private double findMedian() {
if (this.smaller.size() == this.larger.size()) {
return (double) smaller.peek()/2.0 + larger.peek() /2.0;
}
else {
return (double)smaller.peek();
}
}
private void rebalance() {
if (this.smaller.size() > this.larger.size() + 1) {
this.larger.add(this.smaller.poll());
}
else if (this.smaller.size() < this.larger.size()) {
this.smaller.add(this.larger.poll());
}
}
}
Last updated