题目:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
解答:
思路:
- 使用大顶堆+小顶堆的储存方法来存储数组。
- 然后让大顶堆存放较小的值,小顶堆存放较大的值,这样就可以如下图所示的递增关系。
- 为了维持上述关系,,例如:往大顶堆中添加值时,都先需要先将值添加小顶堆中,如果再将小顶堆的堆顶添加到大顶堆中。这样才能保证递增的关系。
- 默认大顶堆的大小>=小顶堆的大小,则中位数就是大顶堆的堆顶或者两个堆顶的平均值。
代码:
class MedianFinder {
Queue<Integer> small;
Queue<Integer> big;
/** initialize your data structure here. */
public MedianFinder() {
big=new PriorityQueue<>();
small=new PriorityQueue<>((x,y)->(y-x));
}
public void addNum(int num) {
if(big.size()==small.size()){
small.add(num);
big.add(small.poll());
}else{
big.add(num);
small.add(big.poll());
}
}
public double findMedian() {
if(big.size() != small.size()) {
return big.peek();
} else {
return (big.peek() + small.peek()) / 2.0;
}
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/