Leetcode: Top K Frequent Elements

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 }
原文地址:https://www.cnblogs.com/EdwardLiu/p/6096328.html