剑指offer T41 数据流的中位数

news/2024/11/28 7:23:34/

中位数就是所有数值排序!!!之后位于中间的数值
既然要对所有元素进行排序,考虑使用自带排序的容器:然后TreeSet和TreeMap都不适合
那考虑使用堆来做
思想:
建立两个堆,一个大顶堆lowHeap,一个小顶堆 highHeap
其中大顶堆lowHeap用于存储已加入数字中较小的那一部分数字(这样堆顶的数字即为那一半较小数字中的最大值)
小顶堆highHeap用于存储已加入数字中较大的那一部分数字(这样堆顶的数字即为那一半较大数字中的最小值)
这样做方便最终求中位数:

case1:若两堆中的数一样多则表明数的总量位偶数,则中位数即为对两个堆的堆顶元素求平均即可
case2:若两堆中的数不一样多,如果我们让小顶堆中的数的个数保持要么始找等于大顶堆中数的个数(对应case1)要么比其多1个的话那么此时中位数即为小顶堆的堆顶元素
所以接下来重点是如何往这两个堆中插入元素还能保持两个堆中元素的数量始终满足条件1:在插入过程中只要始终报错保持小顶堆中元素的个数始终比大顶堆中数的个数最多多1个
可以这么做:

先把数字往大顶堆中插入(先往小区间插),然后如果发现此时小顶堆中的元素个数不满足条件1
那么我们就可以把堆顶元素(最大的那个)插入到小顶堆中(用于存储较大那部分数的那个堆),然后此时又有可能破坏条件1,即小顶堆中元素的个数有可能比大顶堆中元素的个数多1个以上,那我就把小顶堆的堆顶元素(较大那部分数中最小的那个给淘汰掉)把其放回到大顶堆中,这样就有可能使条件1成立))
一直重复上述步骤直到所有数都被插入完成

class MedianFinder {PriorityQueue<Integer> smallHeap;PriorityQueue<Integer> bigHeap;/** initialize your data structure here. */public MedianFinder() {smallHeap = new PriorityQueue<>();bigHeap = new PriorityQueue<>((o1,o2)->o2-o1);}public void addNum(int num) {bigHeap.add(num);if(bigHeap.size()>=smallHeap.size()){smallHeap.add(bigHeap.poll());if(smallHeap.size()>bigHeap.size()+1){bigHeap.add(smallHeap.poll());}}}public double findMedian() {if(bigHeap.size()==smallHeap.size()){return (bigHeap.peek()+smallHeap.peek())/2.0;}return smallHeap.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.ppmy.cn/news/374381.html

相关文章

力扣LeetCode(二)T41-T80

文章目录 41.缺失的第一个正数42.接雨水43.字符串相乘44.通配符匹配45.跳跃游戏 II &#xff08;贪心&#xff09;46.全排列&#xff08;两种模板&#xff09;47.全排列 II&#xff08;序列不重模板&#xff09;48.旋转图像49. 字母异位词分组50.pow(x,n) &#xff08;快速幂&a…

T41 (i7 集显)安装黑苹果

主体参照http://bbs.pcbeta.com/forum.php?modviewthread&tid1566555 注意那个盘符一定要AF 转载于:https://www.cnblogs.com/souroot/p/4537504.html

剑指offer T41

#include <iostream> using namespace std; void printfcontinuesequence(int a,int b)//打印序列 {for(int ia;i<b;i)cout<<i<< ;cout<<endl; } void findcontinuesequence(int sum) //找序列 {if(sum<3)return;int small 1;int large 2;int …

【纯国产化AI处理器T41ZX-极低功耗,极速快启】

一、结构框图 二、 性能 2.1 CPU。 XBurst2频率范围为1.0GHz-1.4GHz。双核。IPS32 ISA R5的双问题、高性能和低功耗实现。MIPS32 ISA R5加Ingenic SIMD512 ISA。具有同时多线程&#xff08;SMT&#xff09;的双问题、超标量、超级流水线。32K LI D-cache32K LI I-cache&#xf…

T41安装WINDOWS2008驱动历险记

windows2008中文版本出来了&#xff0c;想安装试玩。我的本本是IBM T41 &#xff0c;没想到的是安装完后显卡与无线网卡死活也找不到。想了一切可能的方法&#xff0c;下载了所有VISTA版本可能的驱动却仍然安装不上。今天闲来无事准备死马当活马医&#xff0c;翻箱倒柜找出了X…

T41—支持电池版智能视频处理器

T41L智能视频处理器数据表 一、概述 T4IL是新一代专业智能视频应用处理器&#xff0c;适用于移动摄像机、安全调查、视频通话等视频设备。视频分析等。它集成了新一代4K分辨率的ISP和最新的H264/H265/PEG梳状视频压缩编码器&#xff0c;在高质量图像和低比特率方面领先业界&am…

国外一个比较不错的“资源” 论坛 --- 可以下载永恒之塔 项目代码

https://github.com/Aion-server/Aion-unique ---》上边打开出现的就是可以下载永恒之塔的代码 转载于:https://www.cnblogs.com/wzhanke/p/4891905.html

无盘服务器虚拟盘内存不足,网吧技术 无盘虚拟内存正确设置分析

很多人认为虚拟内存是不能放在系统盘中&#xff0c;如果放了就会影响性能&#xff0c;其实这是一种错误想法。其实不管把虚拟内存放在哪个区中&#xff0c;其都一样的。 无盘客户中只要对机器产生修改的话&#xff0c;服务端都会把这些被修改的数据全放在无盘回写盘中。但什么情…