Given a non-empty array of integers, return the k most frequent elements.
For example,
Given [1,1,1,2,2,3]
and k = 2, return [1,2]
.
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
class Solution {
//标准的桶排序
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer>[] bucket = new List[nums.length];
HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
for(int i = 0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
ArrayList<Integer> res = new ArrayList<Integer>();
for(int i:map.keySet()){
int frequency = map.get(i);
if(bucket[frequency]==null){
bucket[frequency] = new ArrayList<Integer>();
}
bucket[frequency].add(i);
}
for(int i = nums.length-1;i>=0&&res.size()<k;i--){//注意这个位置的res.size()是<k,不能小于等于K,因为当大小为K时就不能再往里添加了!!
if(bucket[i]!=null){
res.addAll(bucket[i]);
}
}
return res;
}
}