
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.
-
public class Solution { //桶排序
public List<Integer> topKFrequent(int[] nums, int k) { //也可以使用PriorityQueue
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
List<Integer> res =new ArrayList<Integer>();
for(int num: nums){
map.put(num,map.getOrDefault(num,0)+1);
}
List<Integer>[] bucket=new List[nums.length+1];
for(int key : map.keySet()){
int freq=map.get(key);
if(bucket[freq]==null){
bucket[freq]=new ArrayList<Integer>();
}
bucket[freq].add(key);
}
for(int i=nums.length;i>=0 && res.size()<k;i--){
if(bucket[i]!=null)
res.addAll(bucket[i]);
}
return res;
}
}Your algorithm's time complexity must be better than O(n log n), where n is the array's size.