当前位置 博文首页 > Inmaturity_7的博客:算法练习帖--69--数据流中的第 K 大元素(ja
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest 类:
KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
(题目来源:力扣(LeetCode))
示例:
输入:
["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 <= 104
0 <= nums.length <= 104
-104 <= nums[i] <= 104
-104 <= val <= 104
最多调用 add 方法 104 次
题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素
1. 大根堆
package com.lxf.test3;
import java.util.*;
public class KthLargest {
public static void main(String[] args) {
//["KthLargest","add","add","add","add","add"]
// [[2,[0]],[-1],[1],[-2],[-4],[3]]
KthLargest kthLargest = new KthLargest(2, new int[]{0});
kthLargest.add(-1);
kthLargest.add(1);
kthLargest.add(-2);
kthLargest.add(-4);
kthLargest.add(3);
}
PriorityQueue<Integer> queue;
int size;
public KthLargest(int k, int[] nums) {
queue= new PriorityQueue<>(k);//创建k大小容量的大根堆
size=k;//大根堆大小
for (int num : nums) {
add(num);//添加数字
}
}
public int add(int val) {
if(queue.size()<size){
//如果大根堆大小小于k,将这个值直接加入大根堆
queue.offer(val);
}else if(queue.peek()<val){
//否则那么此时大根堆大小已经等于k了
//此时如果加入的值大于大根堆的顶元素(也就是大于第k大的数字)
//我们需要先移除堆顶元素,然后再加入该元素
queue.poll();
queue.offer(val);
}
return queue.peek();
}
}
cs