295. Find Median from Data Stream

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

Examples:

[2,3,4] , the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Design a data structure that supports the following two operations:

  • void addNum(int num) - Add a integer number from the data stream to the data structure.
  • double findMedian() - Return the median of all elements so far.
    For example:
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

一刷
題解:
構造一個maxHeap, minHeap,
maxHeap與minHeap的size相同或者大1
maxHeap里面的值都小于minHeap

class MedianFinder {
    
    private Queue<Integer> maxHeap;
    private Queue<Integer> minHeap;

    /** initialize your data structure here. */
    public MedianFinder() {
        maxHeap = new PriorityQueue<Integer>(10, Collections.reverseOrder());
        minHeap = new PriorityQueue<Integer>(); 
        //maxHeap size == minHeap size (+1)
    }
    
    public void addNum(int num) {
        if(maxHeap.size() == minHeap.size()){
            if(!minHeap.isEmpty() && minHeap.peek()<num){
                maxHeap.offer(minHeap.poll());
                minHeap.offer(num);
            }else{
                maxHeap.offer(num);
            }
        }else{
           if(num<maxHeap.peek()){
               minHeap.offer(maxHeap.poll());
               maxHeap.offer(num);
           }else{
               minHeap.offer(num);
           }
        }
    }
    
    public double findMedian() {
        if(minHeap.size() == maxHeap.size()) {
            double a = maxHeap.peek();
            double b = minHeap.peek();
            return (a + b)/2;
        }
        else return maxHeap.peek();
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,776評論 0 33
  • 臉涼涼的,原來不知什么時候,已流了兩行淚。擦去淚,對自己勉強笑了笑,忽然覺得委屈,眼又汪滿了水。仰頭看了會子星。心...
    銘玥詠全閱讀 309評論 0 1
  • 欠錢不要緊, 要努力賺錢來還, 暫時還不上要致電讓人知道你沒忘, 堂堂正正做人,明明白白做事, 不要弄丟了別人對你...
    霖靂盡致閱讀 181評論 2 1