【剑指offer】数据流中的中位数
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
分析:大根堆小根堆法
现在假设数组有序,如果我们把数组的前半部分放入一个大根堆,数组的后半部分放入一个小根堆,那么中位数就只能是大根堆的堆顶元素和小根堆的堆顶元素,或者二者堆顶元素的平均值
我们在插入的时候只有遵循某种规则,就能达到这种效果
插入的时候两个堆的元素数量不同,则将新元素插入数量少的堆
若元素数量相同,则随便插入一个堆
若大根堆的堆顶元素大于小根堆的堆顶元素,则交换其堆顶元素
插入完成后,根据元素的数量来确定中位数的值
时间复杂度:插入一个数O(N*log N),获取中位数O(1)
class Solution
{
public: priority_queue<int,vector<int>,less<int> > q1; //大根堆
priority_queue<int,vector<int>,greater<int> > q2; //小根堆 //插入数
void Insert(int um)
{
int x=um; //插入规则
if(q1.size()==q2.size())
{
q2.push(x);
}
else if(q2.size()>q1.size())
{
q1.push(x);
}
else if(q1.size()>q2.size())
{
q2.push(x);
} //根据大根堆小根堆堆顶元素的关系判断是否交换堆顶元素,
//保证堆中的数据是正确的
//(即大根堆保存有序数组前半部分的元素,小根堆保存有序数组后半部分的元素)
if(q1.size()!=0&&q2.size()!=0)
{
if(q1.top()>q2.top())
{
int a=q1.top();
int b=q2.top();
q1.pop();
q2.pop();
q1.push(b);
q2.push(a);
}
}
}
double GetMedian()
{
double x; //根据元素的数量奇偶和元素的分布来求中位数
if(q1.size()==q2.size())
{
x=(q1.top()*1.0+q2.top()*1.0)/2.0;
}
else if(q2.size()>q1.size())
{
x=q2.top()*1.0;
}
else if(q1.size()>q2.size())
{
x=q1.top()*1.0;
}
return x;
}
};
【剑指offer】数据流中的中位数的更多相关文章
- 剑指Offer——数据流中的中位数
题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. ...
- 剑指Offer-62.数据流中的中位数(C++/Java)
题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使 ...
- 剑指offer--47.数据流中的中位数
时间限制:1秒 空间限制:32768K 热度指数:122511 算法知识视频讲解 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如 ...
- 剑指offer64 数据流中的中位数
priority_queue优先级队列,他的模板声明带有三个参数,priority_queue<Type, Container, Functional> Type 为数据类型, Conta ...
- 剑指 Offer —— 数组中重复的数字
数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...
- 剑指offer 数组中重复的数
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...
- 剑指Offer——数组中出现次数超过一半的数字——一题多解
看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指offer——数组中出现次数超过一半的数字(c++)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...
- 剑指Offer 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只 ...
- 剑指Offer 通过中序和先序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
随机推荐
- python机器学习---线性回归案例和KNN机器学习案例
散点图和KNN预测 一丶案例引入 # 城市气候与海洋的关系研究 # 导包 import numpy as np import pandas as pd from pandas import Serie ...
- 【转载】C#的ArrayList使用Contains方法判断是否包含某个元素
在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,在ArrayList集合中可以使用Contains方法判断是否包含某个元素数据,如果包含则返回true,否则返回false,Cont ...
- i春秋——“百度杯”CTF比赛 十月场——EXEC(命令执行、带外通道传输数据)
查看源码得知由vim编写,所以查找备份以及交换文件 找到 /.index.php.swp ,下载后用vim -r恢复该文件即可得到源码 1 <html> 2 <head> 3 ...
- i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper 、php opcode、sql 报错注入)
打开题目看到提示 "do you know Vulcan Logic Dumper?" ,再查看源码看到"<!-- index.php.txt ?>" ...
- c# 读取数据库得到字符串
public string GetProductType(string connectionString, string barCode) { string pro ...
- 项目中 直接跳后台 不用输入/newadmin
- 4 Linux文件与目录管理
Linux的目录文件结构为树状结构,最顶级目录为根目录 / 其他目录通过挂载可以将他们添加到树中,通过解除挂载可以移除他们 绝对路径: 根目录开始 eg: /usr/share/doc 相对路径: 不 ...
- CPU和Memory压力测试方法
一:用原生Centos自带的工具 1. CPU 下面命令会创建 CPU 负荷,方法是通过压缩随机数据并将结果发送到 /dev/null: cat /dev/urandom | gzip -9 > ...
- 关于METRIC SPACE中的一些概念对比(sequence and net)
由于LaTeX 和其他的编辑软件都不太好用,所以采用手写笔记的方式. ——一个想学代几的大二小萌新
- 在CentOS7.5上安装Docker,在Docker中拉取CentOS7.5镜像并安装SSH服务
# 安装docker yum install -y docker # 启动docker systemctl start docker # 加入开机启动 systemctl enable docker ...