Given a non-empty array of integers, return the k most frequent elements. For example, 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.
很像majority element III, 但是那道题有O(k) extra space的限制,这里没有。有任意extra space, 同时知道elem range情况下,bucket sort最节省时间
语法上注意第5行,建立一个ArrayList的array,后面没有泛型generic
List[] bucket = new List[nums.length + 1]; or
List<Integer>[] = new List[nums.length + 1];
Time Complexity: O(N)
1 class Solution { 2 public List<Integer> topKFrequent(int[] nums, int k) { 3 List<Integer> res = new ArrayList<>(); 4 if (nums == null || nums.length == 0) return res; 5 6 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 7 for (int num : nums) { 8 if (map.containsKey(num)) { 9 map.put(num, map.get(num) + 1); 10 } 11 else map.put(num, 1); 12 } 13 14 List[] bucket = new List[nums.length + 1]; 15 16 for (int key : map.keySet()) { 17 int freq = map.get(key); 18 if (bucket[freq] == null) { 19 bucket[freq] = new ArrayList<Integer>(); 20 } 21 bucket[freq].add(key); 22 } 23 24 for (int i = bucket.length - 1; i >= 0; i --) { 25 if (bucket[i] == null) continue; 26 if (bucket[i].size() + res.size() > k) break; 27 res.addAll(bucket[i]); 28 } 29 return res; 30 } 31 }
方法2: MaxHeap, 用map.entrySet(), return Map.Entry type, 可以调用getKey() 和 getValue()
Time Complexity: O(NlogN)
1 public class Solution { 2 public List<Integer> topKFrequent(int[] nums, int k) { 3 List<Integer> res = new ArrayList<Integer>(); 4 Map<Integer, Integer> freqMap = new HashMap<Integer, Integer>(); 5 6 for (int elem : nums) { 7 if (freqMap.containsKey(elem)) { 8 freqMap.put(elem, freqMap.get(elem)+1); 9 } 10 else { 11 freqMap.put(elem, 1); 12 } 13 } 14 15 Comparator<Map.Entry<Integer, Integer>> comp = new Comparator<Map.Entry<Integer, Integer>>() { 16 public int compare(Map.Entry<Integer, Integer> entry1, Map.Entry<Integer, Integer> entry2) { 17 return entry2.getValue() - entry1.getValue(); 18 } 19 }; 20 21 PriorityQueue<Map.Entry<Integer, Integer>> maxHeap = new PriorityQueue<Map.Entry<Integer, Integer>>(11, comp); 22 23 for (Map.Entry<Integer, Integer> each : freqMap.entrySet()) { 24 maxHeap.offer(each); 25 } 26 27 for (int i=1; i<=k; i++) { 28 res.add(maxHeap.poll().getKey()); 29 } 30 return res; 31 } 32 }