1. 具体题目
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2: 输入: nums = [1], k = 1 输出: [1]
2. 思路分析
首先需要统计数组中各不同元素的出现频率,将其存入哈希表中。之后应将元素按照出现的频率排序,取频率最高的前 k 个元素。为了省去排序的时间,考虑创建一个数组将元素填入,该数组下标为元素的出现频率。由于可能存在出现频率相同的元素,所以将数组元素设置为一个列表,形象地说,就是设置若干个桶,每个桶存储出现频率相同的数。最后倒序遍历该数组,取出前 k 个元素作为结果返回。
3. 代码
1 public List<Integer> topKFrequent(int[] nums, int k) { 2 HashMap<Integer,Integer> map = new HashMap<>(); 3 for(int num : nums){ 4 map.put(num, map.getOrDefault(num, 0) + 1); 5 } 6 //桶排序 7 List<Integer>[] buckets = new ArrayList[nums.length + 1]; 8 for(int key : map.keySet()){ 9 int frequency = map.get(key); //元素出现的频率 10 if(buckets[frequency] == null){ 11 buckets[frequency] = new ArrayList<>(); 12 } 13 buckets[frequency].add(key); //出现频率相同的元素存入同一个桶中 14 } 15 //倒序遍历数组,取倒数的前 k 个元素 16 List<Integer> ans = new ArrayList<>(); 17 for(int i = buckets.length - 1; i >= 0; i--){ 18 if(k <= 0) break; 19 if(buckets[i] == null) continue; 20 for(int num : buckets[i]){ 21 if(k <= 0) break; 22 ans.add(num); 23 k--; 24 } 25 } 26 return ans; 27 }