题目
思路
首先通过一个Map来存储不同数值对应的频次,然后根据优先队列的性质(最小堆),定义优先级比较方式,这里定义频次低的优先级高。通过遍历Map中的键控制优先队列中值的数量即可。
代码
import java.util.*;
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//记录频次
Map<Integer, Integer> map = new TreeMap<>();
for (int num : nums) {
if (!map.containsKey(num)) {
map.put(num, 1);
} else {
map.put(num, map.get(num) + 1);
}
}
//将频次存入优先队列
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return map.get(o1) - map.get(o2);
}
});
for (Integer key : map.keySet()) {
if (pq.size() < k) {
pq.add(key);
} else if (map.get(pq.peek()).compareTo(map.get(key)) < 0) {
pq.remove();
pq.add(key);
}
}
//取出频次
List<Integer> list = new LinkedList<>();
while (!pq.isEmpty()) {
list.add(pq.remove());
}
return list;
}
}