
求解代码
java
private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,
b)->(b - a)); //大顶堆存较小的一半
private PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b)->(a - b));
public void Insert(Integer num) {
if (maxHeap.isEmpty() || num <= maxHeap.peek()) {
maxHeap.add(num);
} else {
minHeap.add(num);
}
balance();
}
public Double GetMedian() {
if (maxHeap.size() == minHeap.size()) {
return (double)((maxHeap.peek() + minHeap.peek()) / 2.0);
} else {
return (double)(maxHeap.size() > minHeap.size() ? maxHeap.peek() :
minHeap.peek());
}
}
private void balance() {
if (Math.abs(maxHeap.size() - minHeap.size()) == 2) {
if (maxHeap.size() > minHeap.size()) {
minHeap.add(maxHeap.poll());
} else {
maxHeap.add(minHeap.poll());
}
}
}
小贴士
1.Java的PriorityQueue默认是小顶堆,这里采用大顶堆maxHeap存储较小的一半,用小顶堆存储较大的一半。
2.(maxHeap.peek() + minHeap.peek()) / 2.0,除以2.0 触发浮点运算,不会丢失小数位