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

求解代码

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 触发浮点运算,不会丢失小数位

相关推荐
Android-Flutter38 分钟前
android jetpack 详解
android·kotlin
三8441 小时前
文件上传基础
android
天空之城--1 小时前
Android Flutter行业最新动态与实用参考(2026年8月第2周)
android·flutter
三少爷的鞋2 小时前
预防远大于治理:Android 架构指南
android
恋猫de小郭2 小时前
Flutter 3.47 发布,快来看看有什么更新吧
android·前端·flutter
2501_937860944 小时前
MySQL表的操作:创建、查看、修改、删除完整实战
android·数据库·mysql
我就是妖怪13 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
心平气和量大福大15 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
阿pin16 小时前
Android随笔-Serializable与Parcelable
android·serializable·parcelable