思路
(PriorityQueue就是小根堆(可改成大根堆))(利用小根堆 和 是否入堆之前的逻辑判断,可以让堆顶始终是第k大的元素)
题目
类结构如下:
代码及注释
class KthLargest {
final int k; // g果然 加上 final 之后 时间和空间都变小了
final PriorityQueue<Integer> q;
public KthLargest(int k, int[] nums) {
this.k = k;
q = new PriorityQueue<>(k);
/* //默认是 小根堆,如果需要改成大根堆,就要重写 comparator
q = new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if((Integer)o1 > (Integer)o2){
return -1;
}else{
return -1;
}
}
}); */
for (int i = 0; i < nums.length; i++) {
add(nums[i]);
}
}
public int add(int val) {
if (q.size() < k) {
q.offer(val);
} else if (val > q.peek()) { //此处 不是容量没达到的情况,但又不全是容量大到的情况下,就可以 用else if 再来一层条件判断,然后才做相应的操作
q.poll();
q.offer(val);
}
return q.peek(); // 反正返回堆顶的元素,初始化类的时候,他又不用add()的返回值
}
}