中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
- 例如
arr = [2,3,4]的中位数是3。 - 例如
arr = [2,3]的中位数是(2 + 3) / 2 = 2.5。
实现 MedianFinder 类:
MedianFinder()初始化MedianFinder对象。void addNum(int num)将数据流中的整数num添加到数据结构中。double findMedian()返回到目前为止所有元素的中位数。与实际答案相差10-5以内的答案将被接受。
class MedianFinder {
// 最大值: 存取较小的一半(需要自定义比较器实现降序)
private PriorityQueue<Integer> maxHeap;
// 最小值:存储较大的一半(默认就是最小堆)
private PriorityQueue<Integer> minHeap;
public MedianFinder() {
maxHeap = new PriorityQueue<>((a,b) -> b - a);
minHeap = new PriorityQueue<>();
}
public void addNum(int num) {
// 先放入最大堆(左边部分)
maxHeap.offer(num);
// 保证最大堆的堆顶 <= 最小堆的堆顶
minHeap.offer(maxHeap.poll());
// 保持平衡:如果最小堆元素更多,挪一个到最大堆
if (minHeap.size() > maxHeap.size()) {
maxHeap.offer(minHeap.poll());
}
}
public double findMedian() {
if (maxHeap.size() > minHeap.size()) {
// 奇数个数字,最大堆多一个元素
return maxHeap.peek();
} else {
// 偶数个数字,取两个堆顶平均值
return (maxHeap.peek() + minHeap.peek()) / 2.0;
}
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
|
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
浙公网安备 33010602011771号