求前n个元素,显然可以使用优先队列解决问题
class Solution {
public int[] topKFrequent(int[] nums, int k) {
// map的键存放nums中的值,map的值存放nums中某个值出现的次数
HashMap<Integer, Integer> map = new HashMap<>();
int length = nums.length;
for (int i = 0; i < length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
// 优先队列中存放的是键值对,根据元素出现的次数(map的值)建立大顶堆,这样做的好处是可以直接根据值取出对应的键
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
// 遍历map,将键值对存入优先队列
Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
pq.offer(iterator.next());
}
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = pq.poll().getKey();
}
return res;
}
}