题目描述
设计一个类来查找流中第k大的元素。注意,它是排序后第k大的元素,而不是第k个不同的元素。
您的KthLargest类将有一个构造函数,它接受一个整数k和一个整数数组nums,后者包含来自流的初始元素。对于每个对方法kthmaximum的调用。添加,返回表示流中第k大元素的元素。
Examples:
int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3); // returns 4
kthLargest.add(5); // returns 5
kthLargest.add(10); // returns 5
kthLargest.add(9); // returns 8
kthLargest.add(4); // returns 8
解决
可以使用优先级队列,小顶堆,维护队列最大数量为k,每次add的时候,先判断队列是否已满,没满直接加入,满了就将要加入的数与堆顶的数(第k大的数)进行比较,没有堆顶大则不插入到堆中,比堆顶大先将堆顶元素弹出,如何插入该数,最后返回堆顶元素。
代码:
class KthLargest {
public PriorityQueue<Integer> queue;
public final int k;
public KthLargest(int k, int[] nums) {
queue = new PriorityQueue<>(k);
this.k =