// 面试题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》第四十一题(数据流中的中位数)的更多相关文章

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

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  2. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  3. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  4. 剑指offer刷题

    1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...

  5. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  6. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  7. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  8. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  9. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  10. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

随机推荐

  1. PHP图片裁剪与缩放示例(无损裁剪图片)

    <?php /* *exif_imagetype -- 判断一个图像的类型 *功能说明:函数功能是把一个图像裁剪为任意大小的图像,并保持图像不变形 *参数说明:输入 需要处理图片的 文件名,生成 ...

  2. window bat 运行 cmd 命令

    新建一个.bat批处理文件,编写以下切换目录 并且执行 ipconfig 命令: cmd /k "cd /d D:phpStudy/WWW & ipconfig" cmd ...

  3. JavaScript实现表单验证_02

    注册3次错误,最终的结果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  4. 一、初始PS软件

     PS的介绍 Adope Photoshop,简称“PS”,是由Adope Systems开发和发行的图像处理软件. Photoshop主要处理以像素所构成的数字图像,使用其众多的编修与绘图工具,可以 ...

  5. 【题解】bzoj 4327 JSOI2012 玄武密码

    原题传送门 我们先对所有询问串建立AC自动机(今天洛咕上有人分不清AC自动机和自动AC机) 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针所能到的所有前缀都是匹配成功的,暴力向 ...

  6. 【题解】Luogu SP8791 DYNALCA - Dynamic LCA

    原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 这道题的难点就在如何求LCA: 我们珂以先对其中一个点进行access操作,然后对另一个点进行access操作,因为L ...

  7. linux下部署git服务器

    我这里用的是redhat7.4, 直接开始吧. 环境 服务端: Redhat7.4 + git(version 1.8.3.1) IP:192.168.137.168 客户端: win7 + git ...

  8. H5浏览器播放RTMP直播流实现切换

    切换直播源的参考:http://blog.csdn.net/u012737182/article/details/73920830

  9. topcoder srm 455 div1

    problem1 link 令$f[x1][y1][x2][y2]$表示矩形(x1,y1)(x2,y2)中能选出的最大值.dp即可. problem2 link 这个题应该有更好的递推公式. 我的做法 ...

  10. Python 打包中 setpy.py settuptools pbr 的了解

    背景 nova服务构建失败,报错: 'tests_require' must be a string or list of strings containing valid project/versi ...