Problem: 347. 前 K 个高频元素
思路
- 小根堆(维护k个高频元素)
- 遍历所有元素,当前堆大小 < k 或者 当前元素出现次数大于堆顶元素出现次数:替换掉堆顶元素
复杂度
⏰ 时间复杂度: O ( n log k ) O(n\log{k}) O(nlogk)
🌎 空间复杂度: O ( n ) O(n) O(n)
Code
class Solution {
public int[] topKFrequent(int[] nums, int k)
{
// 将一个数组(nums)转换为一个 Map 对象,并计算数组中每个元素出现的次数。 键 值 键冲突处理方案
Map<Integer, Integer> map = IntStream.of(nums).boxed().collect(Collectors.toMap(e -> e, e -> 1, Integer::sum));
PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> {
return map.get(o1) - map.get(o2);
});// 存的是元素的值(只存 k 个最高频的元素)
for (Integer x : map.keySet())
{
if (heap.size() < k)
heap.add(x);
else if (map.get(x) > map.get(heap.peek()))
{
heap.remove();//去掉最小的
heap.add(x);//把较大的值加进去
}
}
int[] res = new int[k];
int idx = 0;
while (!heap.isEmpty())
res[idx++] = heap.poll();
return res;
}
}