leetcode.排序.347前k个高频元素-Java

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     }

猜你喜欢

转载自www.cnblogs.com/XRH2019/p/11959468.html