中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
- 例如
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/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
