经典的堆找中位数
class MedianFinder {
PriorityQueue<Integer> pq1;
PriorityQueue<Integer> pq2;
/** initialize your data structure here. */
public MedianFinder() {
pq1 = new PriorityQueue<>((o1, o2) -> o1 - o2);
pq2 = new PriorityQueue<>((o1, o2) -> o2 - o1);
}
public void addNum(int num) {
if(pq1.isEmpty() || num >= pq1.element()) {
pq1.offer(num);
} else {
pq2.offer(num);
}
if(pq1.size() - pq2.size() >= 2) {
pq2.offer(pq1.poll());
} else if(pq2.size() - pq1.size() >= 2) {
pq1.offer(pq2.poll());
}
}
public double findMedian() {
if(pq1.size() == pq2.size()) {
return 1.0 * (pq1.element() + pq2.element()) / 2.0;
}
if(pq1.size() > pq2.size()) {
return pq1.element();
} else {
return pq2.element();
}
}
}

本文介绍了一种利用两个优先队列实现快速查找中位数的经典算法,通过堆的特性优化插入和查询操作,适用于实时数据流中的中位数计算。
822

被折叠的 条评论
为什么被折叠?



