leetcode295.数据流的中位数

思路源于

【大厂程序员带你刷力扣】【LeetCode 295】数据流的中位数|大根堆|小根堆

创建大根堆和小根堆,保证大根堆和小根堆的数量差异在1之内并且大根堆的最大值总是不超过小根堆的最小值(大根堆的所有元素都小于等于小根堆的所有元素,这样就将所有的元素一分为2了),这样中位数就只与大根堆的最大值和小根堆的最小值有关

添加元素时先扔到大根堆,如果大根堆的最大大于小根堆的最小,那么把这个最大送给小根堆,之后如果大根堆的元素比小根堆多2那么就将小根堆的元素送给大根堆,反之同理

返回元素时如果大根堆比小根堆多1说明总体是奇数只需返回大根堆的最大值,小根堆多1那结果就是小根堆的最小值,二者相等则取两者平均值

java 复制代码
class MedianFinder {

    private PriorityQueue<Integer> maxHeap;
    private PriorityQueue<Integer> minHeap;

    public MedianFinder() {
        maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
        minHeap = new PriorityQueue<>();
    }

    public void addNum(int num) {
        maxHeap.add(num);
        if (!maxHeap.isEmpty() && !minHeap.isEmpty() && maxHeap.peek() > minHeap.peek()) {
            minHeap.add(maxHeap.poll());
        }
        if (maxHeap.size() == minHeap.size() + 2) {
            minHeap.add(maxHeap.poll());
        }
        if (maxHeap.size() == minHeap.size() - 2) {
            maxHeap.add(minHeap.poll());
        }
    }

    public double findMedian() {
        if(maxHeap.size()==minHeap.size()+1)
            return maxHeap.peek();
        else if(maxHeap.size()==minHeap.size()-1)
            return minHeap.peek();
        else
            return (maxHeap.peek() + minHeap.peek()) / 2.0;
    }
}
相关推荐
queenlll12 分钟前
P1064 [NOIP 2006 提高组] 金明的预算方案 题解
算法
辉辉健身中16 分钟前
HttpServletRequest知识点
java
摸鱼仙人~20 分钟前
HttpServletRequest深度解析:Java Web开发的核心组件
java·开发语言·前端
nbsaas-boot27 分钟前
收银系统优惠功能架构:可扩展设计指南(含可扩展性思路与落地细节)
java·大数据·运维
你过来啊你30 分钟前
Java面向对象思想解析
android·java
喵手33 分钟前
Java 11 新特性:从模块化到 HTTP/2 深度解析
java·开发语言·http
Alfred king34 分钟前
面试150 IPO
面试·职场和发展·贪心·数组··排序
练习时长两年半的程序员小胡38 分钟前
JVM 基础架构全解析:运行时数据区与核心组件
java·jvm·面试
WildBlue39 分钟前
前端算法秘籍:BFS 算法的 JS 魔法之旅🤩
前端·javascript·算法
烙印60139 分钟前
MySQL的底层原理--InnoDB数据页结构
java·数据库·mysql