Leetcode 295 数据流中的中位数

// 使用两个堆,一个大顶堆(倒三角), 一个小顶堆(梯形)
// 维护两个堆的size相差为1
// 插入的时候看哪边数量更少,那么插入到哪边
// 但保证大顶堆的数比小顶堆的数都小
// 也就是插入大顶堆时,先在小顶堆里插入一下,然后取出小顶堆堆顶元素再插入大顶堆
// 反之亦然

class MedianFinder {
    PriorityQueue<Integer> small;
    PriorityQueue<Integer> large;
    public MedianFinder() {
        large = new PriorityQueue<>(); // 小顶堆保存大于等于中位数的数
        small = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        }); // 小顶堆保存小于等于中位数的数
    }

    public void addNum(int num) {
        if (large.size() >= small.size()) {
            large.offer(num);
            small.offer(large.poll());
        }else {
            small.offer(num);
            large.offer(small.poll());
        }
    }

    public double findMedian() {
        if (large.size() > small.size())
            return large.peek();
        else if (large.size() < small.size())
            return small.peek();
        return (large.peek() * 1.0 + small.peek()) / 2;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值