问题
例子
思路
-
方法1
$$$$
因为要优于O(nlogn),要保证为O(nlogn)
(按照出现次数构建小顶堆) -
方法2
$$$$
代码
//方法1
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//数字,数字出现的次数
Map<Integer,Integer> map = new HashMap<>();
for(int n : nums)
map.put(n, map.getOrDefault(n,0)+1);
//按照出现次数的大小来构建小顶堆
PriorityQueue<Integer> q = new PriorityQueue<>((a,b)->map.get(a)-map.get(b));
for(Integer i : map.keySet()) {
if(q.size()<k) q.offer(i);
else{//数字i出现的次数比队列顶部数组出现的更多
if(map.get(i)>map.get(q.peek())){
q.poll();
q.offer(i);
}
}
}
return new ArrayList<Integer>(q);
}
}
//方法2