Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.


Test Cases

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

Input: nums = [1], k = 1
Output: [1]

Constraints:


Solution

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> count = new HashMap<>();
        PriorityQueue<Integer> pq = new PriorityQueue((a, b) -> count.getOrDefault(b,0) - count.getOrDefault(a, 0));
        for(int n: nums) {
            if (!count.containsKey(n)) {
                pq.offer(n);
            }
            count.put(n, count.getOrDefault(n, 0) + 1);
        }
        int[] result = new int[k];
        int i = 0;
        while(!pq.isEmpty() && i<k) {
            result[i++] = pq.poll();
        }
        return result;
    }
}
Time Complexity: O(nlogn)
Space Complexity: O(n)