Given a non-empty array of integers, return the k most frequent elements.
Given an array [1,1,1,2,2,3]
and k = 2
, return [1,2]
.
This question can be solved in multiple ways
public List topKFrequent(int[] nums, int k) {
Map counterMap = new HashMap();
for(int num : nums) {
int count = counterMap.getOrDefault(num, 0);
counterMap.put(num, count+1);
}
PriorityQueue> pq = new PriorityQueue((a, b) -> a.getValue() - b.getValue());
for(Map.Entry entry : counterMap.entrySet()) {
pq.offer(entry);
if(pq.size() > k) pq.poll();
}
List res = new LinkedList();
while(!pq.isEmpty()) {
res.add(0, pq.poll().getKey());
}
return res;
}
Using Bucket Sort
public List topKFrequent(int[] nums, int k) {
List[] bucket = new List[nums.length + 1];
Map frequencyMap = new HashMap();
for (int n : nums) {
frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
}
for (int key : frequencyMap.keySet()) {
int frequency = frequencyMap.get(key);
if (bucket[frequency] == null) {
bucket[frequency] = new ArrayList();
}
bucket[frequency].add(key);
}
List res = new ArrayList();
for (int i = bucket.length - 1; i >= 0 ; i--) {
if(bucket[i] != null) {
if (k > 0) {
res.addAll(bucket[i]);
}
k -= bucket[i].length;
}
}
return res;
}