[剑指offer] 41. 数据流中的中位数 (大小堆,优先队列)
2024-08-31 09:58:31
对于海量数据与数据流,用最大堆,最小堆来管理。
class Solution {
public:
/*
* 1.定义一个规则:保证左边(大顶堆)和右边(小顶堆)个数相差不大于1,且大顶堆的数值都小于等于小顶堆的数 *
2.大小堆顶可以用优先序列实现
插入规则:
当插入数值小于左边的堆顶时候,就插入左边,否则插入右边堆。(注意初始为空时,插入不能比较)
调整使得满足个数差<=1:
正常时是只有两种情况:p=q或者p=q+1,由于每插一个值就会考虑调整,那么边界情况就是p=q+2或者p+1=q
p=q+2时,弹出左边大顶堆p的堆顶,并将其插入到q
p+1=q时,弹出右边小顶堆q的堆顶,并将其插入到p
* 3. 如果是奇数:中位数mid=左边的堆顶,因为先插入到左边,再插入到右边;为奇数时,中位数就是两个堆顶的平均值.
*/
priority_queue <int, vector<int>,less<int> > p; //大顶堆p,注意最后两个>>不能连写,否则是右移运算
priority_queue <int,vector<int>,greater<int> > q;//小顶堆q void Insert(int num)
{
if(p.empty()||num<p.top())
p.push(num);//队列push,vector是push_back()
else
q.push(num);
if(p.size()==q.size()+)
q.push(p.top()),p.pop();//队列,pop()是删除第一个元素,但没有返回值
if(p.size()+==q.size())
p.push(q.top()),q.pop();
} double GetMedian()
{
return p.size()==q.size() ? (p.top()+q.top())/2.0 : p.top();//除以2.0返回double
} };
最新文章
- 4.bootstrap练习笔记-内容区块
- NOIP2014 day2 T2寻找道路
- 常用的工具cmd命令
- rmmod 无法卸载模块问题
- Objective-C 【@property 的参数问题】
- CodeForces 478B 第八次比赛 B题
- Magic of David Copperfield II(奇偶性)
- springmvc问题汇总
- 确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)
- Android WebView挂马漏洞--各大厂商纷纷落马
- 手把手教你webpack、react和node.js环境配置(上篇)
- alpha-咸鱼冲刺day4-紫仪
- Zepto源码分析之二(新旧版本zepto.Z方法的区别)
- Linux 下压缩与解压.zip和.rar
- 入门项目 A1 start
- Java语言访问Redis数据库之Set篇
- docker安装与卸载
- 学界 | Yann LeCun新作,中日韩文本分类到底要用哪种编码?
- android sqlite blob
- vulcanjs 开源工具方便快速开发react graphql meteor 应用
热门文章
- HDU 5191
- MySQL数据库表的数据插入、修改、删除、查询操作及实例应用
- 线程同步、死锁和通信——Java多线程(二)
- 大数据DDos检测——DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然! 和一个句子的分词算法CRF没有区别!
- nyoj--973--天下第一(SPFA判断负环)
- 两道人数多,课程少,query多的题
- TreeSet中的排序问题——Comparable
- Mvc NuGet 数据迁移
- All Metro Apps on Windows 8.1 Do Not Work
- jquery自动完成插件的使用