每日一题-20240204

题目描述

703. 数据流中的第 K 大元素

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

  • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
  • int add(int val)val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
输入:
["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,则将元素如列。
2.若队列元素数量大于等于k,比较队首元素和待入队元素大小
2.1若队首元素小,则出队,将新元素入队
2.2若队首元素大,则不处理,保持不变

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class KthLargest {

private Queue<Integer> queue = new PriorityQueue();

private int k;
public KthLargest(int k, int[] nums) {
this.k = k;
for (int num : nums) {
if (queue.size() < k) {
queue.offer(num);
} else {
if (queue.peek() < num) {
queue.poll();
queue.offer(num);
}
}
}
}


/**
* 思路:使用优先队列实现(小顶堆)实现
* 1.若队列元素数量小于k,则将元素如列。
* 2.若队列元素数量大于等于k,比较队首元素和待入队元素大小
* 2.1若队首元素小,则出队,将新元素入队
* 2.2若队首元素大,则不处理,保持不变
*
* @param val
* @return int
* @author Forest Dong
* @date 2024/02/23 11:14
*/
public int add(int val) {
if (queue.size() < k) {
queue.offer(val);
return queue.peek();
} else {
if (queue.peek() < val) {
queue.poll();
queue.offer(val);
return queue.peek();
} else {
return queue.peek();
}
}
}

public static void main(String[] args) {
int[] nums = {4, 5, 8, 2};
KthLargest largest = new KthLargest(3, nums);
System.err.println(largest.add(3));
System.err.println(largest.add(5));
System.err.println(largest.add(10));
System.err.println(largest.add(9));
System.err.println(largest.add(4));
}
}