题目
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
提示:
1 <= nums.length <= 10^5
-
k
的取值范围是[1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前
k
个高频元素的集合是唯一的
解答
源代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> occurences = new HashMap<>();
for (int num : nums) {
occurences.put(num, occurences.getOrDefault(num, 0) + 1);
}
PriorityQueue<int[]> prio = new PriorityQueue<>(new Comparator<int[]>() {
public int compare(int[] n1, int[] n2) {
return n1[1] - n2[1];
}
});
for (Map.Entry<Integer, Integer> entry : occurences.entrySet()) {
int num = entry.getKey(), count = entry.getValue();
if (prio.size() == k) {
if (prio.peek()[1] < count) {
prio.poll();
prio.offer(new int[]{num, count});
}
} else {
prio.add(new int[]{num, count});
}
}
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = prio.poll()[0];
}
return res;
}
}
总结
用哈希表存储每个元素对应的出现频率,然后用一个优先队列作为小顶堆,存放“前K个高频元素”。
遍历哈希表,当堆中元素不足K时,可以直接放入;若堆中元素已等于K,那么将堆中出现频率最低的元素(也就是堆顶元素)和当前哈希表元素进行频率比较,如果哈希表元素更大,那就进行替换。文章来源:https://www.toymoban.com/news/detail-685818.html
最终得到的堆中元素就是我们要找到前K个高频元素,然后我们用一个一维数组去存储它们。文章来源地址https://www.toymoban.com/news/detail-685818.html
到了这里,关于【LeetCode】347.前K个高频元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!