数组中出现频率为前k的元素数组
数组中出现频率为前k的元素数组
这个题的作答的过程中,题解细节实现的收获远超于题解思路本身,做完之后我迫不及待的写下这个笔记。
题目描述
本题是来力扣的第347题
本题是移到medium的题,思路并不难,但是在具体的实现细节中,有很多的数据结构的应用,可以说是帮助我扫除了好几个知识点应用模糊的地方。
思路讲解
思路说明的过程也就是列举本题所涉及知识点的过程
-
首先要用Map保存数组里元素的值和出现的次数,这里涉及到了
getOrDefault函数的使用。map.put(num,map.getOrDefault(num,0)+1); -
然后建立优先队列(小根堆),由于保存前k个值
//构建小根堆
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>(){
public int compare(int[] m,int[] n){
return m[1]-n[1];
}
});
-
之后遍历map,根据map的遍历结果往优先队列中存放数据
这里涉及到了map的遍历和优先队列的使用
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
int num = entry.getKey(),count = entry.getValue();
if(queue.size() == k){
if(queue.peek()[1] < count){
queue.poll();
queue.offer(new int[]{num,count});
}
}else{
queue.offer(new int[]{num,count});
}
- 最后,将队列中的元素放入结果数组
整体代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
if(nums == null || nums.length <= 1){
return nums;
}
Map<Integer,Integer> map = new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
//小根堆
//int[]的第一个元素代表数组的值,第二个元素代表该值出现的次数
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>(){
public int compare(int[] m,int[] n){
return m[1]-n[1];
}
});
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
int num = entry.getKey(),count = entry.getValue();
if(queue.size() == k){
if(queue.peek()[1] < count){
queue.poll();
queue.offer(new int[]{num,count});
}
}else{
queue.offer(new int[]{num,count});
}
}
int[] ret = new int[k];
for(int i = 0; i < k; i++){
ret[i] = queue.poll()[0];
}
return ret;
}
}
浙公网安备 33010602011771号