45_數(shù)據(jù)流中的中位數(shù)

要求:如何得到一個(gè)數(shù)據(jù)流中的中位數(shù)?如果從數(shù)據(jù)流中讀出奇數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后位于中間的數(shù)值。如果從數(shù)據(jù)流中讀出偶數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后中間兩個(gè)數(shù)的平均值。
思路 建立一個(gè) 小頂堆 A和 大頂堆 B ,各保存列表的一半元素,且 A 中的數(shù)據(jù)都大于 B 中的數(shù)據(jù),當(dāng)整體數(shù)目為奇數(shù)時(shí),中間的那個(gè)數(shù)就是所求.當(dāng)整體數(shù)目為偶數(shù)時(shí),中間兩個(gè)數(shù)的和再除以 2 ,就能得到結(jié)果。

class MedianFinder {
    Queue<Integer> 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()){
            // 從小頂堆進(jìn)去,插入到大頂堆
            A.add(num);
            B.add(A.poll());
        }else{
            // 從大頂堆進(jìn)去,插入到小頂堆
            B.add(num);
            A.add(B.poll());
        }
    }
    
    public double findMedian() {
        return A.size() != B.size() ? A.peek() : (A.peek()         + B.peek()) / 2.0;  
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容