使用两个堆,大顶堆存放较小的那一半数据,小顶堆存放较大的那一半数据。数据先进大顶堆,后进小顶堆。
则数据量为奇数时,中位数为大顶堆的堆顶;数据量为偶数时,中位数为大顶堆和小顶堆堆顶的平均数。
代码如下:
import java.util.*;
public class Solution {
private int count = 0;
private PriorityQueue<Integer> minHeap = new PriorityQueue<>();
private PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
public int compare(Integer i1, Integer i2) {
return -i1.compareTo(i2);
}
});
public void Insert(Integer num) {
if (count % 2 == 0){
minHeap.offer(num);
maxHeap.offer(minHeap.poll());
} else {
maxHeap.offer(num);
minHeap.offer(maxHeap.poll());
}
count++;
}
public Double GetMedian() {
if (count % 2 == 0) {
return new Double(maxHeap.peek() + minHeap.peek()) / 2;
} else {
return new Double(maxHeap.peek());
}
}
}