题目描述:中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class MedianFinder { private PriorityQueue<Integer> small; private PriorityQueue<Integer> large;
public MedianFinder() { this.large = new PriorityQueue<>(); this.small = new PriorityQueue<>((a, b) -> b - a); }
public void addNum(int num) { if (this.small.size() >= this.large.size()) { this.small.add(num); this.large.add(this.small.poll()); } else { this.large.add(num); this.small.add(this.large.poll()); } }
public double findMedian() { if (this.small.size() > this.large.size()) { return this.small.peek(); } else if (this.small.size() < this.large.size()) { return this.large.peek(); } else { return (this.large.peek() + this.small.peek()) / 2.0; } } }
|