# 数据流的中位数 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(); | |
} | |
} | |
} |