参考
⏰ 时间复杂度: O ( n log k ) O(n\log{k}) O(nlogk)
空间复杂度: O ( n ) O(n) O(n)
class Solution {
public int[] topKFrequent(int[] nums, int k)
{
// 将一个数组(nums)转换为一个 Map 对象,并计算数组中每个元素出现的次数。 键 值 键冲突处理方案
Map map = IntStream.of(nums).boxed().collect(Collectors.toMap(e -> e, e -> 1, Integer::sum));
PriorityQueue 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;
}
}