public List<Integer> topKFrequent(int[] nums, int k) { // assume nums is non-empty; k is always valid // count Map<Integer, Integer> map = newHashMap<>(); for (int val : nums) { map.put(val, map.getOrDefault(val, 0) + 1); } // priority queue List<Integer> result = newArrayList<>(); PriorityQueue<Integer> minPQ = newPriorityQueue<>((v1, v2) -> { return map.get(v1) - map.get(v2); }); for (int val : map.keySet()) { minPQ.offer(val); if (minPQ.size() > k) { minPQ.poll(); } } // output while (minPQ.size() > 0) { result.add(minPQ.poll()); } return result; }
Time: $O(N\log{k})$ Space: $O(N)$
Top K Frequent Words
Given a non-empty list of words, return the k most frequent elements.
Your answer should be sorted by frequency from highest to lowest. If two words have the same frequency, then the word with the lower alphabetical order comes first.