347. Top K Frequent Elements
一、题目
1、审题
2、分析
一个非空整形数组,返回数组中出现次数最多的 k 个数。 其中 1 <= k <= 不同的数值个数。
二、解答
1、思路
方法一、
① 新建一个 List<Integer, Integer>[] : 其中数组下标表示频率(count); List 为数字;
② 新建一个 Map<Integer, Integer>: 其中key: num; value: count;
③ 采用 Map 统计每个数字出现的频率; 遍历 Map 的key, 填充 List[] ;
④ List[] 的最后 k 个 元素即为所求。
public List<Integer> topKFrequent(int[] nums, int k) { // index: count; value: nums List<Integer>[] bucket = new List[nums.length + 1]; // key: num; value: count HashMap<Integer, Integer> frequencyMap = new HashMap<>(); for(int n: nums) frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1); for(int key: frequencyMap.keySet()) { int frequency = frequencyMap.get(key); if(bucket[frequency] == null) bucket[frequency] = new ArrayList<>(); bucket[frequency].add(key); } List<Integer> result = new ArrayList<>(); for(int pos = bucket.length - 1; pos >= 0 && result.size() < k; pos--) { if(bucket[pos] != null) result.addAll(bucket[pos]); } return result; }
方法二、
采用 PriorityQueue 存储较小的数,则每次出队都是出去的最大数。则出队的数进行存储; 出队的 前 K 个即为所求。
public List<Integer> topKFrequent2(int[] nums, int k) { // key: num; value: count HashMap<Integer, Integer> frequencyMap = new HashMap<>(); for(int n: nums) frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1); PriorityQueue<Entry<Integer, Integer>> maxHeap = new PriorityQueue<>(new Comparator<Entry<Integer, Integer>>() { @Override public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) { return o1.getKey() - o2.getKey(); } }); for(Entry<Integer, Integer> entry: frequencyMap.entrySet()) maxHeap.add(entry); List<Integer> result = new ArrayList<>(); while(result.size() < k) { Entry<Integer, Integer> entry = maxHeap.poll(); result.add(entry.getKey()); } return result; }