295. Find Median from Data Stream

295. Find Median from Data Stream

My Solutions:

维持两个priority queue。假设有5个数字,minQ 储存最小的两个,maxQ储存较大的三个,median在maxQ的最上。如果是双数个数字,median是两个pq最上的平均值。

因为pq会自动维护从小到大排列, pq.peek() or pq.poll()返回最上面的最小数字。所以在minQ中储存的其实是负数。比如minQ要储存【-2,-1】。

因此,在add元素时,先把数字加入maxQ,再把maxQ上的最小数字变成负数,加入minQ,如果maxQ数字数量小于minQ了,再把minQ上的最小数字(此时为负数)变成正数,重新加入maxQ。

e.g.

add(1), maxQ = [1], minQ = []

add(2), maxQ = [2], minQ = [-1]

add(3), maxQ = [2,3], minQ = [-1]

add(4), maxQ = [3, 4], minQ = [-2, -1]

class MedianFinder {

    private Queue<Integer> minQ = new PriorityQueue<>();
    private Queue<Integer> maxQ = new PriorityQueue<>();
    /** initialize your data structure here. */
    public MedianFinder() {
        
    }
    
    public void addNum(int num) {
        maxQ.add(num);
        minQ.add(-maxQ.poll());
        if (maxQ.size() < minQ.size()) maxQ.add(-minQ.poll());
    }
    
    public double findMedian() {
        return maxQ.size() > minQ.size() ? maxQ.peek() : (maxQ.peek() - minQ.peek()) / 2.0;
    }
}

Last updated