careercup-高等难度 18.9
18.9 随机生成一些数字并传入某个方法。编写一个程序,每当收到新字符数字时,找出并记录中位数。
类似:设计一个数据结构,包括两个函数,插入数据和获得中位数
解法:
一种解法是使用两个优先级堆:一个大根堆,存放小于中位数的值,以及一个小根堆存放大于中位数的值。这会将所有元素大致分为两半,中间的两个元素位于两个堆的堆顶。这样一来,要找到中位数就是小事一桩。
不过,“大致分为两半”又是什么意思呢?“大致”的意思是,如果有奇数个值,其中一个堆就会多一个值。经观察可知,以下两点为真。
如果maxHeap.size()>minHeap.size(),则maxHeap.top为中位数。
如果maxHeap.size()==minHeap.size(),则maxHeap.top()和minHeap.top()的平均值为中位数。
当要重新平衡这两个堆时,我们会确保maxHeap一定会多一个元素。
//总是保证大根堆的元素大于等于小根堆的
void addNewNumber(int randomNumber)
{
//当大根堆的元素和小根堆的元素相等时
if(maxHeap.size()==minHeap.size())
{
if((minHeap.peek()!=NULL&&randomNumber>minHeap.peek())//此时应该将元素插入小根堆,但是要保证大根堆的元素大于等于小根堆,所以将小根堆这最小的元素插入大根堆,然后将该元素插入小根堆
maxHeap.offer(minHeap.poll());
minHeap.offer(randomNumber);
}
else
{
maxHeap.offer(randomNumber);
}
}
else //大根堆的元素大于小根堆,直接将元素插入小根堆
{
if(randomNumber<maxHeap.peek())
{
minHeap.offer(maxHeap.poll());
maxHeap.offer(randomNumber);
}
else
{
minHeap.offer(randomNumber);
}
}
} double getMedian()
{
if(maxHeap.isEmpty())
{
return ;
}
if(maxHeap.size()==minHeap.size())
{
return (double)(minHeap.peek()+maxHeap.peek())/;
}
else
return maxHeap.peek();
}
careercup-高等难度 18.9的更多相关文章
- careercup-高等难度 18.7
18.7 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成. 解法: 原题 给定字符串,以及一个字典,判断字符串是否能够拆分为字段中的单词.例如,字段为{hell ...
- careercup-高等难度 18.6
18.6 设计一个算法,给定10亿个数字,找出最小的100万个数字.假定计算机内存足以容纳全部10亿个数字. 解法: 方法1:排序 按升序排序所有的元素,然后取出前100万个数,时间复杂度为O(nlo ...
- careercup-高等难度 18.5
18.5 有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(也即相隔几个单词).有办法在O(1)时间里完成搜索操作吗?解法的空间复杂度如何? 解法1:我们假设单词wo ...
- careercup-高等难度 18.2
18.2 编写一个方法,洗一副牌.要求做到完美洗牌,换言之,这幅牌52!种排列组合出现的概率相同.假设给定一个完美的随机发生器. 解法:假定有个数组,含有n个元素,类似如下: [1][2][3][4] ...
- careercup-高等难度 18.1
18.1 编写一个函数,将两个数字相加,不得使用+或其他算术运算符. int add(int a,int b) { ) return a; int sum=a^b; ; return add(sum ...
- 别再埋头刷LeetCode之:北美算法面试的题目分类,按类型和规律刷题,事半功倍
算法面试过程中,题目类型多,数量大.大家都不可避免的会在LeetCode上进行训练.但问题是,题目杂,而且已经超过1300道题. 全部刷完且掌握,不是一件容易的事情.那我们应该怎么办呢?找规律,总结才 ...
- [CareerCup] 18.1 Add Two Numbers 两数相加
18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我 ...
- [CareerCup] 18.12 Largest Sum Submatrix 和最大的子矩阵
18.12 Given an NxN matrix of positive and negative integers, write code to find the submatrix with t ...
- [CareerCup] 18.11 Maximum Subsquare 最大子方形
18.11 Imagine you have a square matrix, where each cell (pixel) is either black or white. Design an ...
随机推荐
- 25个完美的Opencart模板,让顾客无法抗拒!
在线开展业务是当前的流行趋势.OpenCart(点击这里下载),作为一个流行的开源PHP电子商务系统,获取OpenCart模板不在像以前那么困难了.OpenCart容易安装,模板支持良好,扩展功能包十 ...
- Ubuntu关闭图形界面
方法一 sudo /etc/init.d/lightdm stop 方法二 init 3 关闭图形界面 init 5 开启图形界面
- js获取时间搓
var oData=new Date().getTime(2016-01-16); console.log(oData);
- Office 365 plans, SharePoint Online, and SharePoint 2013 on-premises 功能对比列表
Andrew ConnellSharePoint大牛整理了一个各个版本SharePoint功能对比列表,是SharePoint相关人员必备资料.赶紧收藏起来. SharePoint 2013 Feat ...
- TreeSet介绍
一.TreeSet原理: 1.TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 2.Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现 ...
- GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- hdu 4289 Control(最小割 + 拆点)
http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others) Mem ...
- CTE初识
微软从SQl2005起引入了CTE(Common Table Expression)以强化T-SQL.这是一个类似于非持久视图的好东西. 正常的SQL语句: select * from person. ...
- JQuery点击收起,点击展开以及部分非空小验证
<tr> <td nowrap align="right" width="18%"> 解决方案: </td> <td ...
- C++中使用接口
面向对象的语言诸如JAVA提供了Interface来实现接口,但C++却没有这样一个东西,尽管C++ 通过纯虚基类实现接口,譬如COM的C++实现就是通过纯虚基类实现的(当然MFC的COM实现用了嵌套 ...