【大顶堆+小顶堆】数据流中的中位数

求解代码

java 复制代码
private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,
            b)->(b - a)); //大顶堆存较小的一半
    private PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b)->(a - b));

    public void Insert(Integer num) {
        if (maxHeap.isEmpty() || num <= maxHeap.peek()) {
            maxHeap.add(num);
        } else {
            minHeap.add(num);
        }
        balance();
    }

    public Double GetMedian() {
        if (maxHeap.size() == minHeap.size()) {
            return (double)((maxHeap.peek() + minHeap.peek()) / 2.0);
        } else {
            return (double)(maxHeap.size() > minHeap.size() ? maxHeap.peek() :
                            minHeap.peek());
        }
    }

    private void balance() {
        if (Math.abs(maxHeap.size() - minHeap.size()) == 2) {
            if (maxHeap.size() > minHeap.size()) {
                minHeap.add(maxHeap.poll());
            } else {
                maxHeap.add(minHeap.poll());
            }
        }
    }

小贴士

1.Java的PriorityQueue默认是小顶堆,这里采用大顶堆maxHeap存储较小的一半,用小顶堆存储较大的一半。

2.(maxHeap.peek() + minHeap.peek()) / 2.0,除以2.0 触发浮点运算,不会丢失小数位

相关推荐
二流小码农28 分钟前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋2 小时前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我15 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
砖厂小工1 天前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github
张拭心1 天前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心1 天前
Android 17 来了!新特性介绍与适配建议
android·前端
Kapaseker1 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴1 天前
Android17 为什么重写 MessageQueue
android