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;
    }
}
相关推荐
会编程是什么感觉...几秒前
算法 - FOC
线性代数·算法·矩阵·无刷电机
沈千秋.1 分钟前
xss.pwnfunction.com闯关(1~6)
java·前端·xss
U-52184F694 分钟前
【CGAL实战】深入理解二维受约束 Delaunay 网格生成
数据库·算法
疑惑的杰瑞5 分钟前
【C】函数与数组
c语言·开发语言·算法·可变参数
郝学胜-神的一滴6 分钟前
人工智能与机器学习:从理论到实践的技术全景
人工智能·python·程序人生·算法·机器学习
关于不上作者榜就原神启动那件事6 分钟前
Spring Data Redis 使用详解
java·redis·spring
2401_8414956412 分钟前
并行程序设计与实现
c++·python·算法·cuda·mpi·并行计算·openmp
invicinble12 分钟前
java集合类(二)--map
java·开发语言·python
算法与编程之美12 分钟前
不同的优化器对分类精度的影响以及损失函数对分类精度的影响.
人工智能·算法·机器学习·分类·数据挖掘
sali-tec13 分钟前
C# 基于halcon的视觉工作流-章71 深度学习-预处理OCR
开发语言·人工智能·深度学习·数码相机·算法·计算机视觉·ocr