题目
LeetCode
剑指 Offer
思路
- 使用
HashMap
存储数字到出现频率的映射。 - 使用大小为
K
的最小堆存储HashMap
中的映射关系,使用PriorityQueue
实现最小堆。建堆的规则采用出现频率作为依据。 - 最后将堆中的键值对数据中的键取出。
代码
import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Map;
public class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> numToCount = new HashMap<>();
for (Integer num : nums) {
numToCount.put(num, numToCount.getOrDefault(num, 0) + 1);
}
PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
return e1.getValue() - e2.getValue();
}
});
for (Map.Entry<Integer, Integer> entry : numToCount.entrySet()) {
if (minHeap.size() < k) {
minHeap.offer(entry);
} else if (entry.getValue() > minHeap.peek().getValue()) {
minHeap.poll();
minHeap.offer(entry);
}
}
int[] res = new int[k];
int i = 0;
for (Map.Entry<Integer, Integer> entry : minHeap) {
res[i++] = entry.getKey();
}
return res;
}
}
- 后记:
- 使用
HashMap
要熟练插入、遍历、获取键值、获取实值; - 理解
Map.Entry
接口,及其HashMap
的内部类Entry
; - Java中堆的实现
PriorityQueue
的常用方法及其创建。