题目:给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
思路:先使用HashMap统计数组各个元素的个数,其中key代表数组元素,value代表元素出现的次数。然后使用队列进行map排序,排序是从大到小,选取前k个元素即为前k个高频元素
何为优先队列?
函数定义如下:
java
public class PriorityQueue<E> extends AbstractQueue<E>
implements java.io.Serializable {
JDK解释如下:
基于优先级堆的无限优先级队列。优先级队列的元素根据其自然 Sequences 进行排序,或者根据队列构造时提供的 进行排序Comparator(自定义排序规则)
,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 )。ClassCastException
代码及其解释:
java
public int[] topKFrequent(int[] nums, int k) {
// map中的key为数组元素,value为该元素出现的次数
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
map.put(nums[i], map.get(nums[i]) + 1);
} else {
map.put(nums[i], 1);
}
}
// 优先队列,(o1, o2) -> map.get(o2) - map.get(o1) 升序排列
PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> map.get(o2) - map.get(o1));
// 遍历map,将元素放入优先队列中,会自动排序
for (int i : map.keySet()) {
queue.add(i);
}
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = queue.poll();
}
return result;
}