# 数据流的中位数 2

除了上次我们自己实现的 大顶堆 和小堆顶的类

我们还可以使用现成的类在 Java 中有一个功能类似的类名字叫 “PriorityQueue” 名为 优先级队列,只不过它的名字不叫 堆

我们用 PriorityQueue 来重写下 数据流的中位数 1 中讲述的题目

解题思路都是类似的:我们先定义一个 左边的大顶堆,再定义一个右边的小顶堆。用两个堆来解决 这道题目

# 代码实现如下:

/**
 * @author Dkx
 * @version 1.0
 * @2024/1/2311:13
 * @function
 * @comment
 */
@SuppressWarnings("all")
public class E04Leetcode295_2
{
    // 大顶堆
    private PriorityQueue<Integer> left = new PriorityQueue<>(
            // 定义 比较规则
            // PriorityQueue 默认提供的是 根节点是最小值 (小堆) 如果想让 根节点是最大值 (大堆) 就需要 将比较器 反转
            (a, b) -> Integer.compare(b, a)
    );
    // 小顶堆
    private PriorityQueue<Integer> right = new PriorityQueue<>();
    // 向堆中添加元素
    private void addNum(int num)
    {
        // 判断 如果 两个堆里面的数目相等 那么就 加左边
        if(left.size() == right.size())
        {
            right.offer(num);
            left.offer(right.poll());
        }else
        {
            // 如果两个 堆里面的 数目不相等 那么就 加右边
            left.offer(num);
            right.offer(left.poll());
        }
    }
    // 计算中位数
    private double findMedian()
    {
        // 如果 两个 堆里面的 数目相等那么就返回 两个堆的 堆顶元素 除 2 的平均值 就是 中位数
        if(left.size() == right.size())
        {
            return (left.peek() + right.peek()) / 2.0;
        }else
        {
            // 如果 两个堆里面的数目 不相等那么 就说明 左边堆的 堆顶元素就是中位数了
            return left.peek();
        }
    }
}