45_数据流中的中位数

要求:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路 建立一个 小顶堆 A和 大顶堆 B ,各保存列表的一半元素,且 A 中的数据都大于 B 中的数据,当整体数目为奇数时,中间的那个数就是所求.当整体数目为偶数时,中间两个数的和再除以 2 ,就能得到结果。

class MedianFinder {
    Queue A,B;
    /** initialize your data structure here. */
    public MedianFinder() {
        A = new PriorityQueue<>(); // 小顶堆。保存较大的一半
        B = new PriorityQueue<>((x,y)->(y-x)); // 大顶堆,保存较小的一半
    }
    
    public void addNum(int num) {
        if(A.size()!=B.size()){
            // 从小顶堆进去,插入到大顶堆
            A.add(num);
            B.add(A.poll());
        }else{
            // 从大顶堆进去,插入到小顶堆
            B.add(num);
            A.add(B.poll());
        }
    }
    
    public double findMedian() {
        return A.size() != B.size() ? A.peek() : (A.peek()         + B.peek()) / 2.0;  
    }
}

你可能感兴趣的:(45_数据流中的中位数)