题目的链接在这里:https://leetcode-cn.com/problems/top-k-frequent-elements/
题目大意
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。一、示意图
二、解题思路
java实现
代码如下:
class Solution {
public int[] topKFrequent(int[] nums,int k) {
//前k个的话,排序只能统计对应的值的大小
// 如果不考虑排序的话,其实是可以用一些其他的数据结构来实现的
//这里就用到了桶排序,为每个值设立一个桶,桶内记录出现的次数,再进行排序
//构造HashMap key:num中的每个元素,Value对应元素出现的次数(即频率)
Map<Integer,Integer> store=new HashMap<>();
for(int i:nums){
//填充HashMap
if(store.containsKey(i)){
store.put(i,store.get(i)+1);//如果包含的话,也就是已经存在了,那就放进去,但是为什么要减一呢
}else{
store.put(i,1);
}
}
//构造一个桶的集合(即一系列桶),桶的个数为nums的长度+1,因为buckets[0]没有意义
//目的是将出现频率为i的数放在第i个桶里(即buckets[i])
List<Integer>[] buckets=new List[nums.length+1];
for(int key:store.keySet()){
//某个数在HashMap中的Value是几就会被放在第几个桶里
int value=store.get(key);
if(buckets[value]==null){
//如果某个桶还未放过数字(即未初始化),则初始化其为某一个数组
buckets[value]=new ArrayList();
}
//然后将数字放在桶中
buckets[value].add(key);
}
int[] res=new int[k];
int index=0;
for(int i=buckets.length-1;i>0;i--){
//遍历每个桶
if(buckets[i]!=null){
//如果桶里有数字
for(int j=0;j<buckets[i].size()&&index<k;++j){
//依次将桶里的数字填充到res数组中
res[index++]=buckets[i].get(j);
}
}
}
return res;
}
}