LeetCode295:Find Median from Data Stream

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

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

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

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

class MedianFinder {
    PriorityQueue<Integer> maxheap;
    PriorityQueue<Integer> minheap;

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

    // 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()<minheap.size()){
            return minheap.peek();
        }else if(maxheap.isEmpty()&&minheap.isEmpty()){
            return 0;
        }else{
            return (maxheap.peek()+minheap.peek())/2.0;
        }

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值