给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
答案:
1public List<Integer> topKFrequent(int[] nums, int k) {
2 List<Integer>[] bucket = new List[nums.length + 1];
3 Map<Integer, Integer> frequencyMap = new HashMap<>();
4 for (int n : nums) {
5 frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
6 }
7 for (int key : frequencyMap.keySet()) {
8 int frequency = frequencyMap.get(key);
9 if (bucket[frequency] == null) {
10 bucket[frequency] = new ArrayList<>();
11 }
12 bucket[frequency].add(key);
13 }
14 List<Integer> res = new ArrayList<>();
15 for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; pos--) {
16 if (bucket[pos] != null) {
17 res.addAll(bucket[pos]);
18 }
19 }
20 return res;
21}
解析:
frepuencyMap中的key是数组中元素,value是数组中元素的个数。代码比较简单,很容易理解,但由于题目没有说清楚,导致算法可能有些不严谨,比如数组【1,1,2,2,3】,我们如果求前2高的元素,结果为【1,2】,但如果是求前1高的元素,那么就会有两种选择,要么是1,要么是2,当上面解法会把1,2都包含,假如我们只要1,或者2种的一个,我们就要这样写
1public List<Integer> topKFrequent(int[] nums, int k) {
2 List<Integer>[] bucket = new List[nums.length + 1];
3 Map<Integer, Integer> frequencyMap = new HashMap<>();
4 for (int n : nums) {
5 frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
6 }
7 for (int key : frequencyMap.keySet()) {
8 int frequency = frequencyMap.get(key);
9 if (bucket[frequency] == null) {
10 bucket[frequency] = new ArrayList<>();
11 }
12 bucket[frequency].add(key);
13 }
14 List<Integer> res = new ArrayList<>();
15 for (int pos = bucket.length - 1; pos >= 0; pos--) {
16 if (bucket[pos] != null) {
17 for (int i = 0; i < bucket[pos].size() && res.size() < k; i++)
18 res.add(bucket[pos].get(i));
19 }
20 }
21 return res;
22}
把上面15-19行的代码换成下面15-20行的代码即可。