使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
思路:构建两个堆,左边大根堆放较小的数,右边小根堆放较大的数。插入第一个数时,先插到左边,然后将左边最大的值传给右边的堆;插入第二个数时,先插到右边,然后将右边最小的值传给左边的堆…如此往复,也就是插入第奇数个数时,先插到左边,最后得到的结果是右边堆的值都比左边的大。由上面规律可知,如果总数为奇数个,则右边比左边多一个。
import java.util.PriorityQueue;
public class Solution {
PriorityQueue<Integer> leftMaxHeap = new PriorityQueue<>(((o1, o2) -> o2.compareTo(o1)));
PriorityQueue<Integer> rightMinHeap = new PriorityQueue<>();
int count = 0;
public void Insert(Integer num) {
count++;
if ((count & 1) == 1) { //(count & 1) == 0为偶数,(count & 1) == 1为奇数
leftMaxHeap.add(num);
rightMinHeap.add(leftMaxHeap.poll());
} else {
rightMinHeap.add(num);
leftMaxHeap.add(rightMinHeap.poll());
}
}
public Double GetMedian() {
if ((count & 1) == 0) {
return (leftMaxHeap.peek() + rightMinHeap.peek()) / 2.0;
} else {
return (double) rightMinHeap.peek();
}
}
}