题目
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
题解
方式一:哈希表 + 堆
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
// 也可以将Map.Entry放到List中按value排序,取前K个
// ArrayList<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
// list.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());
for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
if (minHeap.size() < k) {
minHeap.offer(entry);
} else if (entry.getValue() > minHeap.peek().getValue()) {
minHeap.poll();
minHeap.offer(entry);
}
}
int[] result = new int[k];
int i = 0;
while (!minHeap.isEmpty()) {
result[i++] = minHeap.poll().getKey();
}
return result;
}
总结
数据结构:哈希表、堆