当前位置: 首页 > news >正文

Leecode热题100-295.数据流中的中位数

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

  • 例如 arr = [2,3,4] 的中位数是 3 。
  • 例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。

实现 MedianFinder 类:

  • MedianFinder() 初始化 MedianFinder 对象。

  • void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

示例 1:

输入
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出
[null, null, null, 1.5, null, 2.0]解释
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);    // arr = [1]
medianFinder.addNum(2);    // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3);    // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

提示:

  • -105 <= num <= 105
  • 在调用 findMedian 之前,数据结构中至少有一个元素
  • 最多 5 * 104 次调用 addNum 和 findMedian

本题我用的是双堆的解法,一个小根堆,一个大根堆,堆的特性要了解,默认情况下顶上是小的,越往下越大(小顶堆)

class MedianFinder {/**先定义两个堆,一个小根(大顶)堆,用来放小的数,一个大跟堆(小顶)用来放大的数记住堆默认是小顶堆(大根堆)*/PriorityQueue<Integer> minHeap;PriorityQueue<Integer> maxHeap;public MedianFinder() {/**初始化两个堆 */minHeap = new PriorityQueue<>((a,b)->b-a);maxHeap = new PriorityQueue<>();}public void addNum(int num) {/**如果加入的数比maxHeap的顶(这个堆里最大的数)大,就放入小顶堆其他情况放入小顶堆*/if(minHeap.isEmpty() || num <= minHeap.peek()) {minHeap.offer(num);/**为了平衡 */if(minHeap.size() > maxHeap.size() + 1) {maxHeap.offer(minHeap.poll());}} else {maxHeap.offer(num);/**为了平衡 */if(maxHeap.size() > minHeap.size() + 1) {minHeap.offer(maxHeap.poll());}}}public double findMedian() {/**谁的元素多弹出谁的顶 */if(maxHeap.size() > minHeap.size()) {return maxHeap.peek();} else if(maxHeap.size() < minHeap.size()) {return minHeap.peek();} else {/**如果元素一样,弹出他们俩的顶的平均数 */return (double)(maxHeap.peek() + minHeap.peek())/2;}}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();*/


http://www.mrgr.cn/news/43345.html

相关文章:

  • U3D游戏开发之场景解锁小系统(UGUI版)
  • MySQL基础之约束
  • Android2024.2.1升级错误
  • 表达式求值(可以计算两位数以上)
  • 【云原生】云原生架构的反模式
  • dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结
  • 今日指数项目个股描述功能实现
  • 弧形导轨驱动器高效使用技巧!
  • 双十一狂欢派对 五款市面上获得好评的好物
  • 【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵
  • 实现 Spring IOC 的关键问题和技术详解
  • 基于SpringBoot+Vue的高校运动会管理系统
  • X3U·可编程控制器的定位控制
  • 文心智能体——制作你的专属AI
  • 如何让猫咪长肉?瘦猫增重猫罐测评:fellicita、希喂、wellness好不好?
  • Python环境安装教程
  • Linux线程(七)线程安全详解
  • hdfs伪分布式集群搭建
  • 打卡第一天 B2005 字符三角形
  • k8s 之动态创建pv失败(踩坑)