设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。 请实现 KthLargest 类: KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。 int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。 示例: 输入: ["KthLargest", "add", "add", "add", "add", "add"] [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]] 输出: [null, 4, 5, 5, 8, 8] 解释: KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]); kthLargest.add(3); // return 4 kthLargest.add(5); // return 5 kthLargest.add(10); // return 5 kthLargest.add(9); // return 8 kthLargest.add(4); // return 8
时间: 2024-04-11 09:29:02 浏览: 68
下面是一个实现找到数据流中第 k 大元素的类的示例代码:
```java
import java.util.PriorityQueue;
class KthLargest {
private PriorityQueue<Integer> minHeap;
private int k;
public KthLargest(int k, int[] nums) {
this.k = k;
this.minHeap = new PriorityQueue<>(k);
for (int num : nums) {
add(num);
}
}
public int add(int val) {
if (minHeap.size() < k) {
minHeap.offer(val);
} else if (val > minHeap.peek()) {
minHeap.poll();
minHeap.offer(val);
}
return minHeap.peek();
}
}
```
在这个类中,我们使用一个最小堆来维护数据流中的前 k 大元素。在初始化时,我们先将数组中的元素加入到最小堆中,然后每次调用 add 方法时,如果堆的大小小于 k,我们直接将元素加入堆中;如果堆的大小已经达到 k,我们判断当前元素是否大于堆顶元素,如果是,则将堆顶元素弹出,并将当前元素加入堆中。最后,返回堆顶元素即为当前数据流中第 k 大的元素。
根据给定的示例,我们可以这样使用这个类:
```java
KthLargest kthLargest = new KthLargest(3, new int[]{4, 5, 8, 2});
System.out.println(kthLargest.add(3)); // 输出 4
System.out.println(kthLargest.add(5)); // 输出 5
System.out.println(kthLargest.add(10)); // 输出 5
System.out.println(kthLargest.add(9)); // 输出 8
System.out.println(kthLargest.add(4)); // 输出 8
```
输出的结果与示例中的期望输出一致。
阅读全文