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;
    }
}
相关推荐
xifangge202511 小时前
jdk版本不一样怎么办?一台电脑如何完美共存 JDK 8/11/17/21?多版本无缝切换与 IDEA 环境隔离实战指南
java·开发语言·jdk·intellij-idea
码银11 小时前
在若依框架中,使用easyExcel完成动态列导出
java·excel·ruoyi
彦为君11 小时前
Spring AOP 原理深度解析:从动态代理到切面织入(最新!Spring6与Spring5的差异)
java·后端·spring
XiYang-DING12 小时前
Spring Boot 集成 Hutool 实现图片验证码
java·spring boot·后端
Controller-Inversion12 小时前
76. 最小覆盖子串
java·算法·leetcode
_日拱一卒12 小时前
LeetCode:437路径总和Ⅲ
算法·leetcode·职场和发展
Yunzenn12 小时前
深度解析字节前沿研究-Cola DLM第 04 章:Cola DLM 架构全景 —— 三层解耦的设计哲学
java·linux·python·深度学习·面试·github·transformer
MepSUxjvy12 小时前
拆解 OpenHands(11)--- Runtime主要组件
java·windows·microsoft
专注API从业者12 小时前
用 Open Claw + 淘宝商品接口,快速实现电商商品监控与智能选品(附完整代码)
大数据·前端·数据结构·数据库
ch.ju12 小时前
Java Programming Chapter 4——Member method
java·开发语言