题目链接:https://leetcode.cn/problems/find-median-from-data-stream/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:求数据流中的中位数,想要在时间复杂度低的情况下完成,可以使用一种巧妙的方法,即使用两个优先级队列,一个大顶堆,一个小顶堆,大顶堆的堆顶小于小顶堆的堆顶,每次添加元素要维持两堆size大小相差不超过1,想往大顶堆添加元素,就要先往小顶堆添加,然后把小顶堆的堆顶给大顶堆。想往小顶堆填加元素,就要先往大顶堆添加元素,然后把大顶堆的堆顶给小顶堆。如此中位数就在堆顶。
class MedianFinder {
PriorityQueue<Integer> bigTopHeap;
PriorityQueue<Integer> smallTopHeap;
public MedianFinder() {
bigTopHeap = new PriorityQueue<>((a, b) -> b - a);
smallTopHeap = new PriorityQueue<>();
}
public void addNum(int num) {
if (bigTopHeap.size() >= smallTopHeap.size()) {
bigTopHeap.add(num);
smallTopHeap.add(bigTopHeap.poll());
}else {
smallTopHeap.add(num);
bigTopHeap.add(smallTopHeap.poll());
}
}
public double findMedian() {
if (bigTopHeap.size() > smallTopHeap.size()) {
return bigTopHeap.peek();
} else if (bigTopHeap.size() < smallTopHeap.size()) {
return smallTopHeap.peek();
}
return (bigTopHeap.peek()+smallTopHeap.peek())/2.0;
}
}