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) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int num : nums){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}else{
map.put(num,1);
}
}
List<Integer>[] list = new List[nums.length];
for(int key:map.keySet()){
if(list[map.get(key)-1] ==null){
list[map.get(key)-1] = new ArrayList<Integer>();
}
list[map.get(key)-1].add(key);
}
List<Integer> res = new ArrayList<Integer>();
for(int i=list.length-1;i>=0 && k>0;i--){
if(list[i]!=null){
res.addAll(list[i]);
k -= list[i].size();
}
}
return res;
}
}
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int num : nums){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}else{
map.put(num,1);
}
}
List<Integer>[] list = new List[nums.length];
for(int key:map.keySet()){
if(list[map.get(key)-1] ==null){
list[map.get(key)-1] = new ArrayList<Integer>();
}
list[map.get(key)-1].add(key);
}
List<Integer> res = new ArrayList<Integer>();
for(int i=list.length-1;i>=0 && k>0;i--){
if(list[i]!=null){
res.addAll(list[i]);
k -= list[i].size();
}
}
return res;
}
}