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;
    }
}

 

posted on 2017-10-12 15:01  keepshuatishuati  阅读(112)  评论(0编辑  收藏  举报