要求:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路 建立一个 小顶堆 A和 大顶堆 B ,各保存列表的一半元素,且 A 中的数据都大于 B 中的数据,当整体数目为奇数时,中间的那个数就是所求.当整体数目为偶数时,中间两个数的和再除以 2 ,就能得到结果。
class MedianFinder {
Queue<Integer> A,B;
/** initialize your data structure here. */
public MedianFinder() {
A = new PriorityQueue<>(); // 小顶堆。保存较大的一半
B = new PriorityQueue<>((x,y)->(y-x)); // 大顶堆,保存较小的一半
}
public void addNum(int num) {
if(A.size()!=B.size()){
// 从小顶堆进去,插入到大顶堆
A.add(num);
B.add(A.poll());
}else{
// 从大顶堆进去,插入到小顶堆
B.add(num);
A.add(B.poll());
}
}
public double findMedian() {
return A.size() != B.size() ? A.peek() : (A.peek() + B.peek()) / 2.0;
}
}