面试题41. 数据流中的中位数(大顶堆,小顶堆)

231 阅读1分钟

采用大顶堆维护较小的一部分,小顶堆维护较大的一部分
大顶堆的元素比小顶堆的元素多一个
public class Num41数据流中的中位数 {
    Queue<Integer>minHeap, maxHeap;
    public Num41数据流中的中位数() {
        //小根堆
        minHeap = new PriorityQueue<>();
        //大根堆
        maxHeap = new PriorityQueue<>((x, y) -> y - x);
    }

    public void addNum(int num) {
        maxHeap.offer(num);
        if (!minHeap.isEmpty() && maxHeap.peek() > minHeap.peek()) {
            //交换根顶元素
            int v1 = maxHeap.poll();
            int v2 = minHeap.poll();
            minHeap.offer(v1);
            maxHeap.offer(v2);
        }
        if (maxHeap.size() > minHeap.size() + 1) {
            minHeap.offer(maxHeap.poll());
        }
    }

    public double findMedian() {
        if ((maxHeap.size() + minHeap.size()) % 2 == 1) {
            return maxHeap.peek();
        }
        return (maxHeap.peek() + minHeap.peek()) / 2.0;
    }
}