《剑指offer》第四十一题(数据流中的中位数)
// 面试题41:数据流中的中位数
// 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么
// 中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,
// 那么中位数就是所有数值排序之后中间两个数的平均值。 #include <iostream>
#include <algorithm>
#include <vector> using namespace std; template<typename T> class DynamicArray
{
public:
void Insert(T num)
{
if (((min.size() + max.size()) & ) == )//没插入前判断当前总个数是奇还是偶,偶时插入最小堆
{
if (max.size() > && num < max[])//若该值属于最大堆
{
max.push_back(num);//则先插入最大堆
push_heap(max.begin(), max.end(), less<T>());//使最后一个元素插到合适位置,符合最大堆规则 num = max[];//令num等于最大堆里的最大值 pop_heap(max.begin(), max.end(), less<T>());//交换最大堆的最大值和最后一个值,弹出最大值,符合最大堆规则
max.pop_back();//删除最后一个元素,即刚才所述的最大值
} min.push_back(num);//将num插入最小堆
push_heap(min.begin(), min.end(), greater<T>());//使最后一个元素插到合适位置,符合最小堆规则
}
else//奇数插入最大堆,使大小堆保持平衡,下面代码同上
{
if (min.size() > && min[] < num)
{
min.push_back(num);
push_heap(min.begin(), min.end(), greater<T>()); num = min[]; pop_heap(min.begin(), min.end(), greater<T>());
min.pop_back();
} max.push_back(num);
push_heap(max.begin(), max.end(), less<T>());
}
} T GetMedian()
{
int size = min.size() + max.size();
if (size == )
throw exception("No numbers are available"); T median = ;
if ((size & ) == )
median = min[];//若总个数是奇数,则中值是最小堆的顶点
else
median = (min[] + max[]) / ;//否则是最大堆和最小堆的顶点平均值 return median;
} private:
vector<T> min;
vector<T> max;
}; // ====================测试代码====================
void Test(const char* testName, DynamicArray<double>& numbers, double expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); if (abs(numbers.GetMedian() - expected) < 0.0000001)
printf("Passed.\n");
else
printf("FAILED.\n");
} int main()
{
DynamicArray<double> numbers; printf("Test1 begins: ");
try
{
numbers.GetMedian();
printf("FAILED.\n");
}
catch (const exception&)
{
printf("Passed.\n");
} numbers.Insert();
Test("Test2", numbers, ); numbers.Insert();
Test("Test3", numbers, 3.5); numbers.Insert();
Test("Test4", numbers, ); numbers.Insert();
Test("Test6", numbers, 3.5); numbers.Insert();
Test("Test5", numbers, ); numbers.Insert();
Test("Test7", numbers, 3.5); numbers.Insert();
Test("Test8", numbers, ); numbers.Insert();
Test("Test9", numbers, 3.5); numbers.Insert();
Test("Test10", numbers, );
system("pause");
return ;
}
《剑指offer》第四十一题(数据流中的中位数)的更多相关文章
- 剑指offer 面试题. 数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指offer刷题
1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
- 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或
剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...
- 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位
剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...
随机推荐
- Google's Machine Learning Crash Course #04# First Steps with TensorFlow
1.使用 TensorFlow 的建议 Which API(s) should you use? You should use the highest level of abstraction tha ...
- 2016 icpc ECfinal && codeforcesgym101194
一不小心惨变旅游队,不过上海的风景不错 顺带找其他队交流一下集训经验...或许可以成为选拔和集训16级的依据 A.直接模3就可以了,2^(3*n)%7=1 C.Mr. Panda and Strips ...
- centos6下jbd2进程占用大量IO处理
刚在尝试重现一个bug时,好像在killed mysql一段时间之后,io一直很高,如下: 12:40:01 PM CPU %user %nice %system %iowait %steal %id ...
- 面试必问:Spring循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- replace 将逗号替换~
var reg = new RegExp(",","g"); //"g"表示全局替换var aa="qq,ww";aa= ...
- SSH服务拒绝了密码
原因一:密码错误 解决方法:修改密码 方式一:救援模式修改密码 方式二:单用户模式破解root密码 原因二: /etc/ssh/sshd_config里设置禁止root用户直接远程登录 解决方法: v ...
- QML使用的内置对象
QML从ECMAScript继承而来,所以支持这个ECMAScript.经常在QML工程中看到Math.Data.....等方法,但是在Qt手册里搜索不到,这是因为这些方法不是QtQuick的,而是E ...
- python --- 11 第一类对象 函数名 闭包 迭代器
一 .函数名的运用 ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址 ③ 函数名可以赋值给其他变量 ④函数名可以当做容器类 ...
- Django 中如何让外部访问本地的静态资源
简单使用 在Django中打开一个入口,让别人可以访问media文件 在settings中配置 MEDIA_ROOT=os.path.join(BASE_DIR,'media') 在路由中配置 fro ...
- JPush Flutter Plugin(Futter推送-极光推送)
https://pub.flutter-io.cn/packages/jpush_flutter JPush's officially supported Flutter plugin (Androi ...