给定一个整数数组 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
是数组大小。
import java.util.Map;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> numMap = new HashMap<>();
for (int num : nums) {
if (!numMap.containsKey(num)) {
numMap.put(num, 0);
}
numMap.put(num, numMap.get(num) + 1);
}
PriorityQueue<Pair<Integer, Integer>> pq = new PriorityQueue<>(new Comparator<Pair<Integer, Integer>>(){
@Override
public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
return -p1.getValue().compareTo(p2.getValue());
}
});
for (Map.Entry<Integer, Integer> entry : numMap.entrySet()) {
Pair<Integer, Integer> p = new Pair<>(entry.getKey(), entry.getValue());
pq.add(p);
}
int[] result = new int[k];
for (int i = 0; i < k; i++) {
Pair<Integer, Integer> pair = pq.poll();
result[i] = pair.getKey();
}
return result;
}
}
//leetcode submit region end(Prohibit modification and deletion)