剑指offer63:数据流中的中位数
题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
本题最开始简单的理解为求中位数,使用的是快排的思想,当数据元素为奇数个时,求第n/2大的数,当元素个数为偶数时,先求n/2个数,然后对右边的求出一个最小值。
看了别人的做法,发现应该把这道题理解为一个在线算法题。关键是使用两个堆,最大化堆存储前n/2个数,最小化堆存储后n/2个数,当元素个数为偶数个时,元素num放入最小化堆中;元素个数为奇数时,元素num放入最大化堆。最终,当元素个数为奇数时,中位数就是最小化堆的堆顶;当元素个数为偶数时,中位数是最小化堆和最大化堆的堆顶的均值。
class Solution {
private:
vector<int> minHeap; //数组中的后一半元素组成一个最小化堆
vector<int> maxHeap; //数组中的前一半元素组成一个最大化堆
public:
void Insert(int num) {
if(((minHeap.size()+maxHeap.size()) & ) == ) { //偶数数据的情况下,则在最小堆中插入元素
if(maxHeap.size() > && num < maxHeap[]) {
maxHeap.push_back(num);
push_heap(maxHeap.begin(), maxHeap.end(), less<int>());
num=maxHeap[];
pop_heap(maxHeap.begin(), maxHeap.end(), less<int>());
maxHeap.pop_back();
}
minHeap.push_back(num); //把前一半找到的最大值放到后一半中
push_heap(minHeap.begin(), minHeap.end(), greater<int>());
} else {
if(minHeap.size() > && num > minHeap[]) { //奇数数据的情况下,则在最大堆中插入元素
minHeap.push_back(num);
push_heap(minHeap.begin(), minHeap.end(), greater<int>());
num=minHeap[];
pop_heap(minHeap.begin(), minHeap.end(), greater<int>());
minHeap.pop_back();
}
maxHeap.push_back(num); //把后一半找到的最大值放到前一半中
push_heap(maxHeap.begin(), maxHeap.end(), less<int>());
}
}
double GetMedian() {
int size=minHeap.size() + maxHeap.size();
if(size==) return -;
if((size&) != ) {
return (double) minHeap[];
} else {
return (double) (maxHeap[] + minHeap[]) / ;
}
}
};
剑指offer63:数据流中的中位数的更多相关文章
- 剑指Offer——数据流中的中位数
题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. ...
- 剑指offer--47.数据流中的中位数
时间限制:1秒 空间限制:32768K 热度指数:122511 算法知识视频讲解 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如 ...
- 剑指Offer-62.数据流中的中位数(C++/Java)
题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使 ...
- 剑指offer64 数据流中的中位数
priority_queue优先级队列,他的模板声明带有三个参数,priority_queue<Type, Container, Functional> Type 为数据类型, Conta ...
- 【Java】 剑指offer(41) 数据流中的中位数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中 ...
- Go语言实现:【剑指offer】数据流中的中位数
该题目来源于牛客网<剑指offer>专题. 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位 ...
- 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列
剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
- 【剑指Offer】数据流中的中位数 解题报告(Python)
[剑指Offer]数据流中的中位数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
随机推荐
- 探求Floyd算法的动态规划本质
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
- express 阮一峰的博客
http://javascript.ruanyifeng.com/nodejs/express.html next没怎么用过... 一个不进行任何操作.只传递request对象的中间件 functio ...
- EBS trace分析
下载Trace Analyzer,打开bin下的traceanalyzer.bat 即可分析EBS的trace文件,图形化界面,无需tkprof 需要配置javahome,确认java版本为1.6以上 ...
- Android-intent.addFlags-Activity启动模式
之前写的Android-Activity启动模式(launchMode),Android-Activity启动模式-应用场景,讲解的都是在AndroidManifest.xml配置launchMode ...
- LeetCode145:Binary Tree Postorder Traversal
题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...
- C# OleDbConnection对特定部分Excel的数据读取
最近在写winform程序,先来一个简单的. 读取特定部分Excel的数据读取,读取Excel第30行开始到H列的数据 using System;using System.Collections.Ge ...
- [USACO06DEC] 牛奶模式Milk Patterns
题目链接:戳我 我们知道后缀数组的h数组记录的是后缀i和后缀i-1的最长公共前缀长度,后缀的前缀其实就是子串. 因为是可以重复出现的子串,所以我们只要计算哪些h数组的长度大于等于x即可.这一步操作我们 ...
- $_ENV和$GLOBALS预定义变量
1,$_ENV该全局数组可以获取环境变量,在php5.3中默认禁用,但是可以在php.ini中启用. variables_order="EGPCS" 2,$GLOBALS一个包含了 ...
- extjs4.0以上添加多行工具栏的方法
4.0.0起提供了dockedItems ,只要写两个dockItem,xtype为'toolbar',dock为 'top'即可
- 配置阿里云ESC服务器部署项目
第一次SSH登录 ECS 服务器: 打开命令行终端(git),键入: > ssh root@39.108.54.110 输入实例密码,进入服务器环境. 配置 root 及应用账号权限 新增管理员 ...