问题
- 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。
如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
解决
class MedianFinder {
PriorityQueue<Integer> queMin;
PriorityQueue<Integer> queMax;
//使用优先级队列,
public MedianFinder() {
queMin = new PriorityQueue<Integer>((a, b) -> (b - a)); //小于中位数
queMax = new PriorityQueue<Integer>((a, b) -> (a - b)); //大于中位数
}
public void addNum(int num) { //从数据流中添加一个整数到数据结构中。
if (queMin.isEmpty() || num <= queMin.peek()) { //如果min堆不为空或者当前数小于等于堆顶元素
queMin.offer(num); //将num放入堆
if (queMax.size() + 1 < queMin.size()) { //如果大堆大小+1小于小堆,那么就将小堆的堆顶元素给大堆,保证中位数
queMax.offer(queMin.poll());
}
} else {
queMax.offer(num);
if (queMax.size() > queMin.size()) {
queMin.offer(queMax.poll());
}
}
}
public double findMedian() { //返回目前所有元素的中位数
if (queMin.size() > queMax.size()) {
return queMin.peek();
}
return (queMin.peek() + queMax.peek()) / 2.0;
}
}