题目
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
代码实现
大根堆+小根堆
/**
* 维护一个大根堆,一个小根堆
* 大根堆的size大于等于小根堆
* 奇数的时候返回大根堆的头,偶数时返回(大根堆的头+小根堆的头)/ 2
*/
class MedianFinder {
PriorityQueue<Integer> queue1,queue2;
/** initialize your data structure here. */
public MedianFinder() {
//大根堆
queue1 = new PriorityQueue((o1,o2)->{return (int)o2-(int)o1;});
//小根堆
queue2 = new PriorityQueue((o1,o2)->{return (int)o1-(int)o2;});
}
public void addNum(int num) {
//两个堆元素数量一样时,先将元素加到小根堆,再从小根堆弹出一个最小的元素放进大根堆,保证大根堆元素个数比小根堆多一个
if (queue1.size() == queue2.size()){
queue2.offer(num);
queue1.offer(queue2.poll());
}else {
//两个堆元素数量不等只可能是大根堆数量比小根堆数量多一
queue1.offer(num);
queue2.offer(queue1.poll());
}
}
public double findMedian() {
if (queue1.size() == queue2.size()){
return (double) (queue1.peek() + queue2.peek()) / 2;
}else {
return queue1.peek();
}
}
}