剑指offer 面试题. 数据流中的中位数

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

解答:

这题没做过,用一个最大堆和一个最小堆来夹逼中位数,记录一下这个方法。

限制条件有两个:

1.最大堆的数都比最小堆小,这一点可以通过二者的top来限制(即限制最大堆的top小于最小堆的top)。

2.最小堆的size要么等于最大堆的size,要么比最大堆的size大1。这是什么意思呢,举个栗子:

最大堆:1,2,3,4

最小堆:6,7,8,9(当然这里不符合堆的性质,只是举例其中含有的数字)

那么此时二者size相同,中位数就是最小堆的top。

如果最小堆多一个10,即此时最小堆为:6,7,8,9,10

那么中位数就恰好是最大堆的top和最小堆的top的平均数。

另外一点就是priority_queue默认是最大堆,greater<int>是最小堆,less<Int>是最大堆,下次记住吧。。。。

代码:

 1 class Solution {
 2 public:
 3     priority_queue<int,vector<int>,less<int>> heap_le;
 4     priority_queue<int,vector<int>,greater<int>> heap_ri;
 5     void Insert(int num)
 6     {
 7         if(heap_le.empty() or heap_le.top()>=num){
 8             heap_le.push(num);
 9         }
10         else{
11             heap_ri.push(num);
12         }
13         while(not heap_le.empty() and not heap_ri.empty() and heap_le.top()>heap_ri.top()){//保持性质1
14             heap_ri.push(heap_le.top());
15             heap_le.pop();
16         }
17         while(heap_le.size()>heap_ri.size()){//保持性质2
18             heap_ri.push(heap_le.top());
19             heap_le.pop();
20         }
21         while(heap_le.size()<heap_ri.size()-1){//保持性质2
22             heap_le.push(heap_ri.top());
23             heap_ri.pop();
24         }
25     }
26
27     double GetMedian()
28     {
29         return (heap_le.size()+heap_ri.size())%2?heap_ri.top()*1.0:(heap_le.top()+heap_ri.top())/2.0;
30     }
31 };

2020-02-14 15:14:57

原文地址:https://www.cnblogs.com/FdWzy/p/12307543.html

时间: 2024-11-06 07:22:29

剑指offer 面试题. 数据流中的中位数的相关文章

剑指Offer对答如流系列 - 数据流中的中位数

面试题41:数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 所谓数据流,就是不会一次性读入所有数据,只能一个一个读取,每一步都要求能计算中位数. 问题分析 相信上一道题 最小的k个数 给了你容器的启示. 我们将读入的数据分为两部分,一部分数字小,另一部分大. 小的一部分采用大顶堆存放,大的一部分采用小顶堆存放.当总个数为偶数时,使

《剑指offer》:[64]数据流中的中位数

题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数据排序后中间两个数的平均值. 例如:1,2,3,4,5的中位数为:3.1,2,3,4的中位数为:(2+3)/2=3. 方案一:采用Partition来解决.在[29]中我们讲过,快速查找中的Partition函数是十分重要,是一个比较常用的算法.所以这里我们采用partion函数来解决.从字符流里读字符,插入到一个无需的数组中的复杂度为

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指offer 面试题8:旋转数组的最小数字 题解

面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个已从小到大排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.(要求不能直接遍历数组来求解.) 提交网址: http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159 或 http: