原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvzpxi/
解法一:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
PriorityQueue<int[]> queue = new PriorityQueue<int[]>((a,b) -> b[1] - a[1]);
for (int key : map.keySet()) {
queue.add(new int[]{key,map.get(key)});
}
int[] res = new int[k];
for (int i = 0 ; i < k ; i++) {
res[i] = queue.poll()[0];
}
return res;
}
}
思路:最大堆解决,我们首先通过一个map统计出所有元素出现的次数,然后将map中每一对(key,map.get(key))作为一个数组存入到最大堆中,最后我们取出最大堆中的前k个元素即可(因为取出来数组且数组中有两个元素,那么我们去数组中的第一个元素就好了)。
解法二:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
PriorityQueue<int[]> queue = new PriorityQueue<int[]>((a,b) -> a[1] - b[1]);
for (int key : map.keySet()) {
queue.add(new int[]{key,map.get(key)});
if (queue.size() > k) {
queue.poll();
}
}
int[] res = new int[k];
int index = k-1;
while (!queue.isEmpty()) {
res[index--] = queue.poll()[0];
}
return res;
}
}
思路:解法一中我们使用最大堆来完成了此题的解,其实我们也可以使用最小堆来完成。首先统计数组元素的个数,然后放到最小堆中,这里需要注意一下的是我们只需要保存k个元素,所以多余的元素我们将其去掉即可。