[leetcode]347. Top K Frequent Elements K個最常見元素
阿新 • • 發佈:2018-11-08
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
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.
題目
給定陣列,求其中出現頻率最高的K個元素。
思路
bucket sort
程式碼
1 /* 2 Time: O(n) 3 Space: O(n) 4 */ 5 class Solution { 6 public List<Integer> topKFrequent(int[] nums, int k) { 7 // freq map 8 Map<Integer, Integer> map = new HashMap<>(); 9 for (int num : nums) { 10 map.put(num, map.getOrDefault(num, 0) + 1); 11 } 12 // bucket sort on freq 13 List<Integer>[] buckets = new List[nums.length + 1];14 for (int i : map.keySet()) { 15 int freq = map.get(i); 16 if (buckets[freq] == null) { 17 buckets[freq] = new ArrayList<>(); 18 } 19 buckets[freq].add(i); 20 } 21 // gather result 22 List<Integer> res = new ArrayList<>(); 23 for (int i = buckets.length - 1; i >= 0; --i) { 24 if (buckets[i] == null) continue; 25 for (int item : buckets[i]) { 26 res.add(item); 27 28 if (k == res.size()) return res; 29 } 30 } 31 return res; 32 } 33 }
思路
priorityqueue to track Top K Frequent Elements
1. Using HashMap and PriorityQueue
2. Build a HashMap to get the item frequency
3. PriorityQueue (minHeap)
4. If the PQ size > k, then we pop the lowest value in the PQ
跟[leetcode]692. Top K Frequent Words K個最常見單詞完全思路一致
程式碼
1 /* 2 Time: O(nlogk) 3 Space: O(k) 4 */ 5 class Solution { 6 public List<Integer> topKFrequent(int[] nums, int k) { 7 // freq map 8 Map<Integer, Integer> map = new HashMap(); 9 for(int num : nums){ 10 map.put(num, map.containsKey(num) ? map.get(num) + 1 : 1); 11 } 12 // maintain a k-size minHeap 13 PriorityQueue <Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>((entry1, entry2) -> entry2.getValue() - entry1.getValue()); 14 15 for(Map.Entry<Integer, Integer> entry : map.entrySet()){ 16 minHeap.add(entry); 17 } 18 19 List<Integer> result = new ArrayList<>(); 20 while(!minHeap.isEmpty() && result.size() < k){ 21 result.add(0, minHeap.remove().getKey()); 22 } 23 return result; 24 } 25 }