Leetcode347.前 K 个高频元素
实现步骤基本分为:
- 统计字母的频次 map
- 对其进行排序 -大小顶堆
- 获得前k个元素
java实现基础知识
-map: 使用map实现类LinkedHashMap
- 特定方法 getOrDefault(对应值,默认值)
- key-存数字 value-存频次
-PriorityQueue:
- 小顶堆:
PriorityQueue<int[]> que = new PriorityQueue<>(((o1, o2) -> o1[1]-o2[1]));
- 为什使用小顶堆:因为每次pop输出的都是出口处元素
class Solution {
public int[] topKFrequent(int[] nums, int k) {
//建立map--使用LinkedHashMap
//用于统计出现频率
//方法 map.put(key,value)---value
// 使用map.getOrDefault(nums[i],0)
//完成map初始化
Map<Integer, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
//建立堆队列并定义规则 o1-o2小顶堆 o2-o1 大顶堆
PriorityQueue<int[]> que = new PriorityQueue<>(((o1, o2) -> o1[1]-o2[1]));
//对小顶堆进行存储 key value均存入,只不过使用value进行比较
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
//队列的size<k ----只添加
if(que.size()<k){
que.add(new int[]{entry.getKey(),entry.getValue()});
}else {
//大于k 此元素出现次数>出口处元素次数 是先出栈再入栈
if (entry.getValue()>que.peek()[1]){
que.poll();
que.add(new int[]{entry.getKey(),entry.getValue()});
}
}
}
int[] ans = new int[k];
//调转结果队列顺序生成ans
for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多
ans[i] = que.poll()[0];
}
return ans;
}
}
此题还需要再仔细看逻辑,复习;