问题描述
LeetCode 347. 前 K 个高频元素 (opens in a new tab),难度中等。
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2
输入: nums = [1], k = 1 输出: [1]
提示:
1 <= nums.length <= 105
k
的取值范围是[1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前
k
个高频元素的集合是唯一的
进阶: 你所设计算法的时间复杂度 必须 优于 O(n log n)
,其中 n
是数组大小。
题解
暴力
解题思路:使用 Map 统计每个数字的频率,然后根据 value 大小排序。
Solution.java
import java.util.*;
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> mp = new HashMap<>();
for (int num : nums) {
if (mp.containsKey(num)) {
mp.put(num, mp.get(num) + 1);
} else {
mp.put(num, 1);
}
}
// map 根据 value 排序
List<Map.Entry<Integer, Integer>> lst = new ArrayList<>(mp.entrySet());
lst.sort(Map.Entry.comparingByValue());
int[] result = new int[k];
for (int i = 0; i < k; ++i) {
result[i] = lst.get(lst.size() - i - 1).getKey();
}
return result;
}
}