前k个高频元素
问题描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
提示:
1 <= nums.length <= 10^5
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
示例
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
解题思路
-
用map记录数组中元素出现的频率
- 将map中元素都存入PriorityQueue,优先队列会维护队列内元素以大根堆(或小根堆)的形式排序
- 从优先队列中取k个元素的key,即为数组的前K个高频元素
代码实现
java
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
//用map记录数组中元素出现的频率
for (Integer num : nums) {
map.put(num, map.getOrDefault(num,0)+1);
}
//创建一个以大根堆形式存储队内元素的优先队列
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2) -> pair2[1] - pair1[1]);
//map中元素以数组形式存入PriorityQueue
for (Map.Entry entry : map.entrySet()) {
//注意:此处需要进行强制类型转换,因为entry.getKey()与entry.getValue()的返回类型是Object!!!
pq.add(new int[]{(Integer)entry.getKey(),(Integer)entry.getValue()});
}
//从优先级队列中取k个元素的key,并加入结果集中
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = pq.poll()[0];
}
return res;
}
}
复杂度
时间复杂度:
PriorityQueue类的add方法的时间复杂度为O(logn), 调用了n次所以时间复杂度为O(nlogn)
空间复杂度:
度:
PriorityQueue类的add方法的时间复杂度为O(logn), 调用了n次所以时间复杂度为O(nlogn)
空间复杂度:
O(n)