问题


例子

思路
-
方法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

本文介绍了一种解决数据结构问题的方法,如何在O(nlogk)的时间复杂度内找到数组中出现频率前K高的元素。文中提到了两种策略,包括通过构建小顶堆来保持元素按出现次数的降序排列,以及另一种解决方案。
652

被折叠的 条评论
为什么被折叠?



