Design a class to find the kth
largest element in a stream. Note that it is the kth
largest element in the sorted order, not the kth
distinct element.
Implement KthLargest
class:
KthLargest(int k, int[] nums)
Initializes the object with the integerk
and the stream of integersnums
.int add(int val)
Appends the integerval
to the stream and returns the element representing thekth
largest element in the stream.
Example 1:
Input ["KthLargest", "add", "add", "add", "add", "add"] [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]] Output [null, 4, 5, 5, 8, 8] Explanation 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
Constraints:
1 <= k <= 104
0 <= nums.length <= 104
-104 <= nums[i] <= 104
-104 <= val <= 104
- At most
104
calls will be made toadd
. - It is guaranteed that there will be at least
k
elements in the array when you search for thekth
element.
经典的data stream里找kth largest的问题,典型的heap解法。找k个最大的,那就用size为k的min heap来存k个最大的,于是heap top就是第k个最大的了。(只要记住找的大小和堆的大小相反就行)
就是脑子不太清醒,这里要写的是一个数据结构,在constructor里就给好了k和初始化用的数组,于是需要在constructor里写东西啊喂!别的没啥要注意的了。其实可以写的更简洁一点,就是在add里面无脑先pq.add(val),然后再判断如果size > k就无脑poll。
class KthLargest {
PriorityQueue<Integer> pq;
int k;
public KthLargest(int k, int[] nums) {
this.pq = new PriorityQueue<>();
this.k = k;
for (int i : nums) {
add(i);
}
}
// use min heap to store the largest k elements
public int add(int val) {
if (pq.size() >= k) {
if (val > pq.peek()) {
pq.poll();
pq.add(val);
}
} else {
pq.add(val);
}
return pq.peek();
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/