kotlin 703. 数据流中的第 K 大元素 设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。 请实现 KthLargest 类: KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。 int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
时间: 2024-03-24 17:39:50 浏览: 72
可以使用 PriorityQueue 来解决此问题。首先将数组 nums 中的前 k 个元素添加到 PriorityQueue 中。然后遍历数组 nums 的其余元素,如果元素比 PriorityQueue 中的最小值大,则将其添加到 PriorityQueue 中,并将 PriorityQueue 中的最小值删除,保持 PriorityQueue 的大小为 k。最后,PriorityQueue 中的最小值就是第 k 大的元素。
示例代码:
```kotlin
import java.util.*
class KthLargest(k: Int, nums: IntArray) {
private val pq = PriorityQueue<Int>() // 存储前 k 大的元素
private val k = k // 第 k 大
init {
for (num in nums) {
add(num)
}
}
fun add(`val`: Int): Int {
pq.offer(`val`)
if (pq.size > k) {
pq.poll()
}
return pq.peek()
}
}
```
在上面的示例代码中,我们首先创建一个 PriorityQueue,用于存储数组 nums 中的前 k 大的元素。然后遍历数组 nums 的其余元素,如果元素比 PriorityQueue 中的最小值大,则将其添加到 PriorityQueue 中,并将 PriorityQueue 中的最小值删除,保持 PriorityQueue 的大小为 k。最后,add() 方法返回 PriorityQueue 中的最小值,即为第 k 大的元素。
注意,如果要在多个线程中使用 KthLargest 类,需要使用线程安全的 PriorityQueue。可以使用 PriorityBlockingQueue 来实现线程安全的 PriorityQueue。
阅读全文