剑指offer面试题[64]-数据流中的中位数
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
分析:
由于数据是从数据流中读出来的,数据的数目随着时间的变换而变化的。需要请用一个数据容器来保存从数据流中读出来的数据,当有新的数据从流中读出来时,这些数据就插入到数据容器中。
如果数组没有排序,可以用partition函数找出数组中的中位数。在没有排序的数组中插入一个数字和找出中位数的时间复杂度分别是0(1)和0(n).
可以用最大堆和最小堆的思想,详情见剑指offer面试题64。
参考代码如下:
class Solution {
public:void Insert(int num){if((min.size()+max.size()&1)==0) //偶数位置,放入到最小堆{if(max.size()>0&&num<max[0]){ max.push_back(num);push_heap(max.begin(),max.end(),less<int>());num=max[0];pop_heap(max.begin(),max.end(),less<int>());max.pop_back(); } min.push_back(num);push_heap(min.begin(),min.end(),greater<int>());}else //奇数位置,放入到最大堆中{if(min.size()>0&&num>min[0]) {min.push_back(num);push_heap(min.begin(),min.end(),greater<int>());num=min[0];pop_heap(min.begin(),min.end(),greater<int>());min.pop_back(); } max.push_back(num);push_heap(max.begin(),max.end(),less<int>()); }}double GetMedian(){ int size=min.size()+max.size();double medium=0;if(size==0)return 0;if((size&1)==1)medium=min[0];elsemedium=(double)(max[0]+min[0])/2; //注意这里需要强制类型转换为double,不然输出结果精度不够,略了小数部分return medium;}
private:vector<int> min;vector<int> max;
};
剑指offer面试题[64]-数据流中的中位数相关推荐
- 剑指offer面试题41. 数据流中的中位数(二分查找)
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例 ...
- 剑指offer——面试题64:数据流中的中位数
剑指offer--面试题64:数据流中的中位数 Solution1: 最笨的方法了... class Solution { public:void Insert(int num) {num_strea ...
- 剑指offer面试题[40]-数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 注意原题目要求空间复杂度为0(1). 位运算的具体思路可以参看剑指offer. class So ...
- 剑指offer面试题[29]-数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指Offer - 面试题22. 链表中倒数第k个节点(快慢指针)
1. 题目 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5 ...
- 剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)
1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5限制: 0 ...
- 剑指Offer - 面试题61. 扑克牌中的顺子
1. 题目 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大.小王为 0 ,可以看成任意数字.A 不能视为 14. 示 ...
- 剑指Offer - 面试题12. 矩阵中的路径(DFS回溯)
1. 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么 ...
- 剑指Offer - 面试题3. 数组中重复的数字(哈希)
1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...
最新文章
- Java垃圾回收之老年代垃圾收集器
- Linux Kernel TCP/IP Stack — L1 Layer — tcpdump 抓包
- QT自定义窗口插件在QT Creator的应用
- python之operator操作符函数
- Sqlserver 2012 导入 DBF文件
- USB学习6---Linux Android USB软件架构设计
- 使用ObjectInputStream和ObjectOutputStream注意问题
- ElasticSearch搜索语法进阶学习(搜索+聚合,过滤+聚合)
- Range-v3 practical examples
- 文件夹_【教程】创建透明文件夹(非隐藏文件夹哦)
- axios get请求方式
- r语言中的shiny教程_如何使用Shiny在R中编写Web应用程序
- 这才是男朋友该说的话^_^
- xampp如何上传文件到服务器,xampp安装到云服务器
- NYOJ 81:炮兵阵地(状压DP)
- ATF史上最全分析--bl1阶段
- 使用bat注册ocx
- 数据库原理 | 第1章 概述
- Echodyne为其行业领先的CUAS雷达EchoGuard拓展市场
- 数据库中的三种完整性
热门文章
- Iphone革了谁的命?
- 北京思源培训中心---C#下用P2P技术实现点对点聊天(2)
- Oracle 9i初始化参数文件
- OpenResty HelloWorld
- 宝岛探险1(DFS)
- ogg sqlserver2012 抽取不到日志_ogg抽取进程与数据字典的关系
- 【免费毕设】基于PHP实现的WEB图片共享系统(源代码+论文)
- linux rm 命令删除文件恢复_rm删除文件空间就释放了吗?天真!
- char强制类型转换为int_彻底理解Java中的基本数据类型转换(自动、强制、提升)...
- Qt与Visual Assitst X的集成问题