《剑指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 ...
随机推荐
- JavaScript笔记 #07# 用js写算法
算法盒子初代(为了提高学习算法的热情...) 效果图: 所有代码放在单个html中: <!DOCTYPE html> <html> <head> <meta ...
- m3u8文件下载合并的一种方法
# -*- coding: utf-8 -*- """ Created on Wed Mar 14 15:09:14 2018 @author: Y "&quo ...
- j2ee分布式缓存同步实现方案dlcache
现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase.那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多 ...
- windows10 hyper-v安装配置centos6.8
27.PNG 选择最小化安装,并在界面下方选中自定义额外的安装包 28.PNG 选择额外的安装包 29.PNG 选择额外的安装包 30.PNG 终于开始安装了 31.PNG 安装完毕,重启 32.PN ...
- 快速阅读《QT5.9 c++开发指南》1
简介:<QT5.9 c++开发指南>的作者是和i三位主要从事地球物理探测仪器设计.数据处理方法研究和软件开发等工作的博士们,这本书以QT Widget为主要内容,比较全面地教授了QT开发桌 ...
- 2018年湘潭大学程序设计竞赛G又见斐波那契
链接:https://www.nowcoder.com/acm/contest/105/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- vector.resize 与 vector.reserve的区别(转载)
转载:https://blog.csdn.net/shuilan0066/article/details/3588478 reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用 ...
- 【Python023/024--递归】
一.递归--汉诺塔 1.有三个轴(x,y,z),64个盘子,把所有盘子从X轴移动到Z轴,要求移动到Z轴的盘子从上到下排序 思路: 问题一:将X上的63个盘子借助Z移动到Y上,拆解为: a.将前62个盘 ...
- Bootstrap3基础 form-control 圆角的输入框,光标放入后边框变色
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- 如何使用thinkphp的model来验证前端表单?
为了增加安全性, 在向model表中写入和修改数据时, 最好是调用 create方法来保证安全, 然后再调用add和save方法: if($Model->Validate($validate)- ...