题目描述:设计一个类来查找流中第k大的元素。注意,它是排序顺序中第k大的元素,而不是第k个不同的元素。
第k大的类将有一个接受整数k和整数数组nums的构造函数,整数数组nums包含来自流的初始元素。对于对方法kthmaximum的每次调用。添加,返回表示流中第k个最大元素的元素
Example:
/**
* 返回数据流中第k大元素
*
* @author wangfei
*/
public class KthLargest {
final PriorityQueue<Integer> q;
final int k;
/**
* 1.利用优先队列创建元素个数为k的小顶堆
* 2.遍历数组元素添加到优先队列中,前k个元素组成小顶堆,其余元素依次与堆顶元素比较,
* 若堆顶元素小于该元素,则替换堆顶元素并重新排列为小顶堆直至遍历完所有元素
* 3.返回的堆顶元素即为原数组中的第k大元素
*
* @param k
* @param nums
*/
public KthLargest(int k, int[] nums) {
this.k = k;
q = new PriorityQueue<>(k);
for (int val : nums)
add(val);
}
public int add(int val) {
if (q.size() < k)
q.offer(val);
else if (q.peek() < val) {
q.poll();
q.offer(val);
}
return q.peek();
}