// Top K Frequent Elements - https://leetcode.com/problems/top-k-frequent-elements/description/?source=submission-ac
class Solution {
// Time Complexity: O(nlogn)
public int[] topKFrequent(int[] nums, int k) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int count = map.getOrDefault(nums[i], 0);
map.put(nums[i], count + 1);
}
// Sorted in descending order by count
PriorityQueue pq = new PriorityQueue<>(
(el1, el2) -> Integer.compare(el2.j, el1.j)
);
for(Map.Entry entry: map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
pq.offer(new Element(entry.getKey(), entry.getValue()));
}
int[] result = new int[k];
for (int i = 0; i < k && !pq.isEmpty(); i++) {
Element el = pq.poll();
result[i] = el.i;
}
return result;
}
class Element {
int i, j;
Element(int i, int j) {
this.i = i;
this.j = j;
}
}
Time Complexity: O(Nlogk)
Space Complexity: O(N + k)
public int[] topKFrequent(int[] nums, int k) {
Map count = new HashMap<>();
for (int n: nums) {
count.put(n, count.getOrDefault(n, 0) + 1);
}
// Sorted in descending order by count
Queue minHeap = new PriorityQueue<>(
(n1, n2) ->
Integer.compare(count.get(n1),
count.get(n2))
);
for(int n: count.keySet()) {
minHeap.offer(n);
if(minHeap.size() > k) {
minHeap.poll();
}
}
int[] top = new int[k];
for (int i = k - 1; i >= 0; i--) {
top[i] = minHeap.poll();
}
return top;
}
}