LeetCode295:Find Median from Data Stream

最大最小堆
时间复杂度 O(NlogN) 空间O(N) 维护一个最大堆,一个最小堆,最大堆存的是到目前为止较小的那一半数,

最小堆是到目前为止较大的那一半数
最大堆是目前为止较小的那一半数

最好在脑子里面形成一个图,这个图是这样的, 最大堆上面的元素是最大的,下面都是比堆顶元素要小,最小堆上的元素是最小的,说明堆顶元素以下都是比堆顶元素要大的。 这样的话,自然而然的就知道,最大堆 最小堆存储的元素,有什么不同。最重要的一点是要注意平衡堆的大小,最大堆和最小堆相差的size必须是在1以内的

注意2点
第一点:就是每次堆里面的元素入堆的时候,都必须判断最大堆和最小堆的大小
第二点:设计类的题目,注意要写构造函数

class MedianFinder {
    PriorityQueue maxheap;
    PriorityQueue minheap;

    public MedianFinder(){
        maxheap = new PriorityQueue(11,new Comparator(){
            public int compare(Integer o1,Integer o2){
                return o2-o1;
            }
        });
        minheap = new PriorityQueue();
    }

    // Adds a number into the data structure.
    public void addNum(int num) {
        if(maxheap.size()==0||num<=maxheap.peek()){
            if(maxheap.size()>minheap.size()){
                minheap.offer(maxheap.poll());
            }
            maxheap.offer(num);
        }
        else if(minheap.size()==0||num>minheap.peek()){
            if(minheap.size()>maxheap.size()){
                maxheap.offer(minheap.poll());
            }
            minheap.offer(num);
        }
        else{
            if(maxheap.size()<=minheap.size()){
                maxheap.offer(num);
            }else{
                minheap.offer(num);
            }
        }
    }

    // Returns the median of current data stream
    public double findMedian() {
         if(maxheap.size()>minheap.size()){
            return maxheap.peek();
        }else if(maxheap.size()return minheap.peek();
        }else if(maxheap.isEmpty()&&minheap.isEmpty()){
            return 0;
        }else{
            return (maxheap.peek()+minheap.peek())/2.0;
        }

    }
};

你可能感兴趣的:(LeetCode)