力扣 面試題41. 數據流中的中位數 優先隊列+思維

https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/
在這裏插入圖片描述思路:搞兩個堆,假設當前一共有nn個元素,大根堆存儲最小的(n+1)/2(n+1)/2個元素,小根堆存儲最大的n/2n/2個元素,每次插入元素的時候維護這兩個堆就行了,可以證明插入後修改的複雜度爲O(lgn)O(lgn),得到中位數的複雜度爲O(1)O(1)

class MedianFinder {
public:
    /** initialize your data structure here. */
    priority_queue<int> big;
    priority_queue<int,vector<int>,greater<int>> small;
    int siz;
    MedianFinder() {
        siz=0;
    }
    
    void addNum(int num) {
        ++siz;
        big.push(num);
        int res=(siz+1)>>1;
        while(big.size()>res)
            small.push(big.top()),big.pop();
        while(!small.empty()&&big.top()>small.top())
        {
            int val1=big.top(),val2=small.top();
            big.pop(),small.pop();
            big.push(val2);
            small.push(val1);
        } 
    }
    
    double findMedian() {
        if(siz==0)
            return 0;
        else if(siz&1)
            return big.top();
        else
            return (big.top()+small.top())*1.0/2;
    }
};

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章