思路
我的想法是用一张表来记录出现的数字及对应出现的次数。然后对所有数字的出现次数排名。
然后出现排名前k的数字就是目标数字。
提交代码
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map=new HashMap<>();
List<Integer> res=new ArrayList<>();
for(int num:nums)
map.put(num, map.getOrDefault(num, 0)+1);
int[] rank=new int[map.size()];
int i=0;
for(Integer value: map.values()) {
rank[i++] = value;
}
Arrays.sort(rank);
for(int j=rank.length-1;res.size()<k;j--) {
for(Map.Entry<Integer, Integer> entry: map.entrySet()) {
if(entry.getValue()==rank[j]) {
res.add(entry.getKey());
map.remove(entry.getKey());
break;
}
}
}
return res;
}
}
运行结果
使用桶排序
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> fMap=new HashMap<>();
for(int num:nums)
fMap.put(num, fMap.getOrDefault(num, 0)+1);
List<Integer>[] bucket = new List[nums.length+1];
for(int i=0;i<nums.length+1;i++) {
bucket[i]=new ArrayList<>();
}
for(Map.Entry<Integer, Integer> entry:fMap.entrySet()) {
bucket[entry.getValue()].add(entry.getKey());
}
List<Integer> res=new ArrayList<>();
int cnt = 0;
for(int i=nums.length;i>0;i--) {
if(bucket[i]==null||bucket[i].size()==0) continue;
for(int j=0; j<bucket[i].size()&&cnt<k;j++,cnt++)
res.add(bucket[i].get(j));
}
return res;
}
}