// 使用两个堆,一个大顶堆(倒三角), 一个小顶堆(梯形)
// 维护两个堆的size相差为1
// 插入的时候看哪边数量更少,那么插入到哪边
// 但保证大顶堆的数比小顶堆的数都小
// 也就是插入大顶堆时,先在小顶堆里插入一下,然后取出小顶堆堆顶元素再插入大顶堆
// 反之亦然
class MedianFinder {
PriorityQueue<Integer> small;
PriorityQueue<Integer> large;
public MedianFinder() {
large = new PriorityQueue<>(); // 小顶堆保存大于等于中位数的数
small = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}); // 小顶堆保存小于等于中位数的数
}
public void addNum(int num) {
if (large.size() >= small.size()) {
large.offer(num);
small.offer(large.poll());
}else {
small.offer(num);
large.offer(small.poll());
}
}
public double findMedian() {
if (large.size() > small.size())
return large.peek();
else if (large.size() < small.size())
return small.peek();
return (large.peek() * 1.0 + small.peek()) / 2;
}
}
Leetcode 295 数据流中的中位数
最新推荐文章于 2024-04-18 21:08:12 发布