[leetcode]347. Top K Frequent Elements K个最常见元素

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 }

猜你喜欢

转载自www.cnblogs.com/liuliu5151/p/9824008.html