LeetCode传送通道
很好的一道题!
核心知识点:
…①map频率统计;
…②优先级队列(不用的话见解法二)
//解法一
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] result = new int[k];
//1.次数统计map
Map<Integer,Integer> map = new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
//2.优先级队列
//初始化PriorityQueue并自定义排序规则
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair2[1]-pair1[1]); //降序
// map entry存入优先级队列
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
pq.offer(new int[]{entry.getKey(),entry.getValue()});
}
//3.遍历输出
for(int i=0; i<k; i++){ //依次从队头弹出k个元素
result[i] = pq.poll()[0];
}
return result;
}
}
// 解法二
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] result = new int[k];
//1.次数统计map
Map<Integer,Integer> map = new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
//2.排序
//利用Map的entrySet方法转化为list进行排序
List<Map.Entry<Integer, Integer>> entryList = new ArrayList(map.entrySet());
//利用Collections的sort方法对list排序
Collections.sort(entryList, (a, b) ->b.getValue() - a.getValue());
//3.遍历输出排序好的list
for (int i = 0; i < k; i++) {
result[i] = entryList.get(i).getKey();
}
return result;
}
}