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;
    }
}
相关推荐
柳鲲鹏1 小时前
Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central
java·jar
烁3472 小时前
每日一题(小白)模拟娱乐篇13
java·算法·娱乐·暴力
2301_793069822 小时前
前后端分离下,Spring Boot 请求从发起到响应的完整执行流程
java·spring boot·mvc
烁3472 小时前
每日一题(小白)模拟娱乐篇14
java·开发语言·算法·娱乐·暴力
Brookty2 小时前
【算法】插入排序
数据结构·算法·排序算法
xiaolingting4 小时前
Java 二叉树非递归遍历核心实现
java··二叉树非递归遍历
嘵奇4 小时前
深入解析 Java 8 Function 接口:函数式编程的核心工具
java·开发语言
GISer_Jing5 小时前
前端算法实战:大小堆原理与应用详解(React中优先队列实现|求前K个最大数/高频元素)
前端·算法·react.js
一路向北North6 小时前
IDEA加载项目时依赖无法更新
java·ide·intellij-idea
小森77676 小时前
(三)机器学习---线性回归及其Python实现
人工智能·python·算法·机器学习·回归·线性回归