本题的关键点是对map中的value进行排序。
题目中涉及前几个,考虑优先队列
优先队列要通过lamda表达式写清楚是大数在顶还是小数在顶
逆序:
PriorityQueue<Integer> queue = new PriorityQueue<>(((o1, o2) -> o2-o1));
顺序:
PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
泛型中是对象,要明确比较的对象的什么,这点很像Compare
接下来就是要把map中的key-value结构一个一个按照对象取出,利用map.entrySet()
最后总结这道题就是:
思路就是他先hashmap,然后通过entrySet()返回一个集合,然后遍历该集合,用小跟堆来存储
附上代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] result = new int[k];
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
// 根据map的value值正序排,相当于一个小顶堆
PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
for (Map.Entry<Integer, Integer> entry : entries) {
queue.offer(entry);
if (queue.size() > k) {
queue.poll();
}
}
for (int i = k - 1; i >= 0; i--) {
result[i] = queue.poll().getKey();
}
return result;
}
}