随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
左神的视频中讲过具体的思路.最主要的就是:建立一个大顶堆和一个小顶堆.然后大顶堆中放小的数,小顶堆里放大的数.之后根据两个堆的size调整
class MedianFinder {
private PriorityQueue<Integer> minHeap;
private PriorityQueue<Integer> maxHeap;
/**
* initialize your data structure here.
*/
public MedianFinder() {
minHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o2 < o1) {
return 1;
} else {
return -1;
}
}
});
maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o2 > o1) {
return 1;
} else {
return -1;
}
}
});
}
public void modifyTwoHeapSize() {
if (minHeap.size() == maxHeap.size() + 2) {
maxHeap.add(minHeap.poll());
}
if (maxHeap.size() == minHeap.size() + 2) {
minHeap.add(maxHeap.poll());
}
}
//小根堆放大的 大根堆放小的
public void addNum(int num) {
if (maxHeap.isEmpty()) {
maxHeap.add(num);
return;
}
if (maxHeap.peek() >= num) {
maxHeap.add(num);
} else {
if (minHeap.isEmpty()) {
minHeap.add(num);
return;
}
if (minHeap.peek() > num) {
maxHeap.add(num);
} else {
minHeap.add(num);
}
}
modifyTwoHeapSize();
}
public double findMedian() {
if (maxHeap.size() + minHeap.size() == 0) return 0;
if (maxHeap.size() == minHeap.size()) {
return (double) (maxHeap.peek() + minHeap.peek()) / 2;
} else {
return maxHeap.size() > minHeap.size() ? maxHeap.peek() : minHeap.peek();
}
}
}