优先级队列(堆)
- [2.数据流中的第 K ⼤元素(easy)](#2.数据流中的第 K ⼤元素(easy))
2.数据流中的第 K ⼤元素(easy)
题⽬描述:
设计⼀个找到数据流中第 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
提⽰:
1 <= k <= 10^4
0 <= nums.length <= 10^4
-104 <= nums[i] <= 10^4
-104 <= val <= 10^4
最多调⽤ add ⽅法 10^4 次
题⽬数据保证,在查找第 k ⼤元素时,数组中⾄少有 k 个元素
解法(优先级队列):

算法思路:
我相信,看到 TopK 问题的时候,兄弟们应该能⽴⻢想到「堆」,这应该是刻在⻣⼦⾥的记忆。
算法代码:
java
class KthLargest
{
// 创建⼀个⼤⼩为 k 的⼩根堆
PriorityQueue<Integer> heap;
int _k;
public KthLargest(int k, int[] nums)
{
_k = k;
heap = new PriorityQueue<>();
for(int x : nums)
{
heap.offer(x);
if(heap.size() > _k)
{
heap.poll();
}
}
}
public int add(int val)
{
heap.offer(val);
if(heap.size() > _k)
{
heap.poll();
}
return heap.peek();
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/