1202-資料流中的中位數

蜉蝣之一粟發表於2024-12-02

最小棧 leetcode 295.

題目大意:給定一個資料流,實現一個以查詢中位數為方法的類,該類需要有初始化構造方法、新增資料值和查詢中位數的方法
解題思路:主要難點是想用什麼方法,這題肯定不能來一個數字就給資料排序,得用到資料結構,也就是小頂堆和大頂堆,小頂堆儲存最大值部分,大頂堆儲存最小值部分,預設以小頂堆多一個(如果出現資料流長度為奇數堆的情況下),這裡有一個滑動入值的概念,當兩個堆大小不一致時,肯定是小頂堆多於大頂堆了,這時候我得先將該新數字放進小頂堆中過濾(排序)一遍後再將新的小頂堆的堆頂取出來放到大頂堆中去,這樣就不會破壞小頂堆的值是大於大頂堆的值的原則,且是排序了的。當兩個堆大小一致時,同理。查詢中位數的話就是判斷是否大小一致,如果兩個堆大小一致就說明是偶數,那就將兩個堆堆頂拿到/2就可以了,不一致的話我們設定了小頂堆的大小是>=大頂堆的,所以直接拿出小頂堆的堆頂即可。

class MedianFinder {

    Queue<Integer> A,B;

    public MedianFinder() {
        A = new PriorityQueue<>();
        B = new PriorityQueue<>((a, b) -> (b - a));
    }
    
    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() + B.peek()) / 2.0 : A.peek() * 1.0;
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

總結:對於困難型別的題目一開始還是不能被嚇到,要敢於思考想想所學的資料結構有哪些能幫到解決該題目,主要還是這些資料結構運用的不夠熟練,思路其實很清晰了

相關文章