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

堆----3.数据流的中位数

295. 数据流的中位数 - 力扣(LeetCode)

/**

    基础数据结构:

            大顶堆:完全二叉树,任一结点>=其左右孩子;小顶堆:完全二叉树,任一结点<=其左右孩子

    大体做法:

            同时使用一个大顶堆与一个小顶堆,在插入元素时进行限制。

            大顶堆元素最大值 <= 小顶堆元素最小值,且两堆元素相差个数不超过1

            若两堆元素个数相等,则中位数:大顶堆堆顶元素(大顶堆最大值)与小顶堆堆顶元素(小顶堆最小值)的平均数

            若大顶堆的元素更多,则中位数:大顶堆堆顶元素

            若小顶堆的元素更多,则中位数:小顶堆堆顶元素(此处插入方式不存在该情况)

    插入过程:

            首先插入元素时统一直接插入大顶堆(小顶堆也可以)

            再把大顶堆的堆顶元素(大顶堆最大元素)弹出,插入到小顶堆;(即先将元素插入大顶堆,再把大顶堆最大的元素移到小顶堆,实现了大顶堆元素最大值 <= 小顶堆元素最小值)

            此时进行判断,若小顶堆元素更多,则将小顶堆堆顶元素(小顶堆最小元素)弹出,插入到大顶堆中;

            (由于为了实现大顶堆元素最大值 <= 小顶堆元素最小值,将大顶堆的最大元素移到了小顶堆,此时必须要平衡两堆元素,否则元素会全部留在小顶堆中)

    注意事项:

            经过调整后要么两堆元素数量相等,要么大顶堆元素更多,不存在小顶堆元素更多的情况。

*/

/**基础数据结构:大顶堆:完全二叉树,任一结点>=其左右孩子;小顶堆:完全二叉树,任一结点<=其左右孩子大体做法:同时使用一个大顶堆与一个小顶堆,在插入元素时进行限制。大顶堆元素最大值 <= 小顶堆元素最小值,且两堆元素相差个数不超过1若两堆元素个数相等,则中位数:大顶堆堆顶元素(大顶堆最大值)与小顶堆堆顶元素(小顶堆最小值)的平均数若大顶堆的元素更多,则中位数:大顶堆堆顶元素若小顶堆的元素更多,则中位数:小顶堆堆顶元素(此处插入方式不存在该情况)插入过程:首先插入元素时统一直接插入大顶堆(小顶堆也可以)再把大顶堆的堆顶元素(大顶堆最大元素)弹出,插入到小顶堆;(即先将元素插入大顶堆,再把大顶堆最大的元素移到小顶堆,实现了大顶堆元素最大值 <= 小顶堆元素最小值)此时进行判断,若小顶堆元素更多,则将小顶堆堆顶元素(小顶堆最小元素)弹出,插入到大顶堆中;(由于为了实现大顶堆元素最大值 <= 小顶堆元素最小值,将大顶堆的最大元素移到了小顶堆,此时必须要平衡两堆元素,否则元素会全部留在小顶堆中)注意事项:经过调整后要么两堆元素数量相等,要么大顶堆元素更多,不存在小顶堆元素更多的情况。
*/
class MedianFinder {//大顶堆,左半区,存较小的元素private PriorityQueue<Integer> left_maxHeap;//小顶堆,右半区,存较大的元素private PriorityQueue<Integer> right_minHeap; public MedianFinder() {//优先队列实现大/小顶堆left_maxHeap = new PriorityQueue<>((a,b) -> b - a); //大顶堆,自定义比较器right_minHeap = new PriorityQueue<>(); //默认为小顶堆}public void addNum(int num) {//直接插入大顶堆left_maxHeap.offer(num);//保证 大顶堆元素最大值 <= 小顶堆元素right_minHeap.offer(left_maxHeap.poll());//平衡两堆元素个数 要么两堆元素个数相等,要么大顶堆比小丁堆多一个元素if(right_minHeap.size() > left_maxHeap.size()) {left_maxHeap.offer(right_minHeap.poll());}}public double findMedian() {//两堆元素相等 大顶堆堆顶元素(大顶堆最大值)与小顶堆堆顶元素(小顶堆最小值)的平均值if(right_minHeap.size() == left_maxHeap.size()) {return (right_minHeap.peek() + left_maxHeap.peek()) / 2.0;} //要么两堆元素个数相等,要么大顶堆比小顶堆多一个元素return left_maxHeap.peek();}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();*/

http://www.xdnf.cn/news/1272727.html

相关文章:

  • Slab 算法浅析
  • HTML全景效果实现
  • 【Python 语法糖小火锅 · 第 2 涮】
  • 容器技术基础与实践:从镜像管理到自动运行配置全攻略
  • 【数据分享】各省农业土地流转率(2010-2023)
  • 【Python 语法糖小火锅 · 第 4 涮】
  • 【Python 语法糖小火锅 · 第 3 涮】
  • 【unitrix数间混合计算】2.9 小数部分特征(t_non_zero_bin_frac.rs)
  • 【Canvas与旗帜】圆角蓝底大黄白星十一红白带旗
  • UE破碎Chaos分配模型内部面材质
  • CentOS7编译安装GCC
  • 【Python 高频 API 速学 ④】
  • Spring学习笔记:Spring AOP入门以及基于Spring AOP配置的深入学习与使用
  • 嵌入式软件工程师笔试题(二)
  • 腾讯COS云存储入门
  • 原创邮件合并Python工具使用说明(附源码)
  • 安装NodeJS和TypeScript简要指南
  • 东方心绣脸启幕26周年盛典:以匠心锚定百年基业
  • 百度网盘自动启动如何关闭,关闭智能看图
  • AI推理的“灵魂五问”:直面2025算力鸿沟与中国的破局之路
  • 模拟人脑处理文本——从分句到分词,从段落到时间线叙事
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 《汇编语言:基于X86处理器》第12章 复习题和练习
  • 《励曼旋耕》Liman Rotary Tillage
  • 202506 电子学会青少年等级考试机器人五级器人理论真题
  • JVM相关(AI回答)
  • 云渲染的未来已来:渲酷云如何重新定义数字内容生产效率
  • [CUDA] CUTLASS | C++ GEMM内核--高度模板化的类
  • 基于STM32H5的循环GPDMA链表使用
  • C语言指针完全指南:从入门到精通