您的位置:首页 > 职场人生

面试题64. 数据流中的中位数

2017-06-28 10:02 253 查看
题目描述

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

思路1:

Partition算法,找到中位数,详细见这篇博文

思路2:

采用插入排序的方法,每读取一个数字时,用插入排序让数组保持排序状态,需要O(n2)

但是在求中位数时,只需要O(1)。Java中可以借用LinkedList实现插入排序

import java.util.LinkedList;

public class Solution {

private LinkedList<Integer> list = new LinkedList<>();

/**
* 将数据插入到LinkedList中
*/
public void Insert(Integer num) {
if(list.isEmpty() || num < list.getFirst()) {
list.addFirst(num);
}else {
boolean insertSuccess = false;
for(Integer i : list) {
if(num < i) {
int index = list.indexOf(i);
list.add(index, num);
insertSuccess = true;
break;
}
}
if(!insertSuccess) {
list.addLast(num);
}
}
}

/*
* 获取中位数
*/
public Double GetMedian() {
if(list.isEmpty()) {
return null;
}

int mid = list.size() / 2;

// 如果长度是偶数
if((list.size() & 1) == 0) {
Integer first = list.get(mid - 1);
Integer second = list.get(mid);
return Double.valueOf(first + second) / 2.0;
}

return Double.valueOf(list.get(mid));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: