-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_347_TopKFrequent.java
55 lines (45 loc) · 1.92 KB
/
_347_TopKFrequent.java
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
import java.util.*;
/**
* @author jzy
* @since 2024-01-16 9:55:42
*/
public class _347_TopKFrequent {
public static void main(String[] args) {
int[] nums = {1, 1, 1, 2, 2, 3};
int k = 2;
int[] ints = new _347_TopKFrequent().topKFrequent(nums, k);
System.out.println(Arrays.toString(ints));
}
public int[] topKFrequent(int[] nums, int k) {
// map统计元素出现的次数,key表示元素相应的value表示出现的次数
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
// 久
PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
Comparator.comparingInt(Map.Entry::getValue)
);
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (minHeap.size() < k) {
minHeap.add(entry);
} else {
if (entry.getValue() > minHeap.peek().getValue()) {
minHeap.poll();
minHeap.offer(entry);
}
}
}
int[] res = new int[k];
// final int[] index = {0};
// minHeap.forEach(e-> res[index[0]++] = e.getKey()); // 在 Java 中,Lambda 表达式中引用的外部局部变量必须是 final 或 effectively final(一旦赋值后不再修改)。直接使用基本数据类型的 int 变量在 Lambda 表达式中是不允许的,因为该变量无法被修改,而 Lambda 表达式可能会尝试修改该变量的值,这违反了 effectively final 的规则
// 可以使用 AtomicInteger
// AtomicInteger index = new AtomicInteger(0);
// minHeap.forEach(e -> res[index.getAndIncrement()] = e.getKey());
int index = 0;
while (!minHeap.isEmpty()) {
res[index++] = minHeap.poll().getKey();
}
return res;
}
}