Given a non-empty array of integers, return the k most frequent elements.
For example,
Given
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.
Use a min-heap.
Code (Java):
public class Solution { public List<Integer> topKFrequent(int[] nums, int k) { List<Integer> result = new ArrayList<>(); if (nums == null || nums.length == 0) { return result; } // step 1: count the freq of each word Map<Integer, Integer> map = new HashMap<>(); for (int num : nums) { if (map.containsKey(num)) { int freq = map.get(num); map.put(num, freq + 1); } else { map.put(num, 1); } } // step 2: use a min-heap to get the top k frequencies. PriorityQueue<Pair> pq = new PriorityQueue<>(new MyPQComparator()); int count = 0; for (int word : map.keySet()) { int freq = map.get(word); Pair pair = new Pair(freq, word); if (count < k) { pq.offer(pair); } else if (pair.freq > pq.peek().freq) { pq.poll(); pq.offer(pair); } count++; } // step 3: output the result for (Pair pair : pq) { result.add(pair.word); } return result; } private class MyPQComparator implements Comparator<Pair> { @Override public int compare(Pair a, Pair b) { return a.freq - b.freq; } } } class Pair { int word; int freq; Pair(int freq, int word) { this.word = word; this.freq = freq; } }
No comments:
Post a Comment