题目要求:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
问题分析:首先,我们得到的是数据流,需要用一个数据结构来保存从数据流中读出的数据。数组、链表、二叉搜索树、平衡二叉搜索树都是可行的。换一个思路,既然要求的是中位数,排在这个数之前的都比它小,排在这个数之后的都比它大,那么这个数也是中位数。(重要的是“中”,排序也只是为了找到这个“中”的位置。)
代码如下:
1、数组
import java.util.ArrayList;
import java.util.Collections;
public class Solution
{
ArrayList<Integer> data = new ArrayList<Integer>();
public void Insert(Integer num) {
data.add(num);
Collections.sort(data);
}
public Double GetMedian() {
int mid = data.size()/2;
if((data.size()&1) ==0) {
Integer n1 = data.get(mid);
Integer n2 = data.get(mid-1);
double result = (Double.valueOf(n1 +"")+Double.valueOf(n2+""))/2;
return result;
}else {
double result = Double.valueOf(data.get(mid)+"");
return result;
}
}
}
2、