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.
//这道题目有两种解法,一种是桶排序(bucket sort)另外一种方法是PriorityQueue
//解法一,桶排序
public class Solution { public List topKFrequent(int[] nums, int k) { List[] bucket = new List[nums.length + 1]; HashMap<Integer, Integer> map = new HashMap<>(); for (int n : nums) { if (map.containsKey(n)) { map.put(n, map.get(n) + 1); } else { map.put(n, 1); } } for (int key : map.keySet()) { int frequency = map.get(key); if (bucket[frequency] == null) { bucket[frequency] = new ArrayList<>(); } bucket[frequency].add(key); } List res = new ArrayList<>(); for (int pos = bucket.length - 1; pos >=0 && res.size() < k; pos--) { if (bucket[pos] != null) { res.addAll(bucket[pos]); } } return res; } }
//解法二,优先队列
public class Solution { public List topKFrequent(int[] nums, int k) { HashMap<Integer, Integer> map = new HashMap<>(); for (int n : nums) { if (map.containsKey(n)) { map.put(n, map.get(n) + 1); } else { map.put(n, 1); } } PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<Map.Entry<Integer, Integer>>(k, (o1, o2) -> o2.getValue() - o1.getValue()); // PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>( // k, // new Comparator<Map.Entry<Integer, Integer>>(){ // @Override // public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) { // return e2.getValue() - e1.getValue(); // } // } // ); pq.addAll(map.entrySet()); List res = new ArrayList<>(); for (int i = 0; i < k; i++) { res.add(pq.poll().getKey()); } return res; } }