LeetCode347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
class Solution {
public int[] topKFrequent(int[] nums, int k) {
//思路:先以哈希表计算每个元素的频率
//再用小根堆存下频率最k个的元素
//再依次出堆到结果数组中
HashMap<Integer,Integer> map = new HashMap<>();
for(int num:nums)
{
if(map.containsKey(num))
{
map.put(num, map.get(num)+1);
}
else{
map.put(num,1);
}
}
//建立小根堆
PriorityQueue<Integer> min = new PriorityQueue<>((x,y)->map.get(x)-map.get(y));
for(Integer key : map.keySet())
{
if(min.size() < k)
min.add(key);
else{
if( map.get(key) > map.get(min.peek()))
{
min.remove();min.add(key);
}
}
}
int[] ans = new int[k];
int i = 0;
while(!min.isEmpty())
{
ans[i] = min.remove();i++;
}
return ans;
}
}