一、题目
二、代码
class Solution
{
public int[] topKFrequent(int[] nums, int k)
{
//题解中学习得到
//优先级队列,为了避免复杂api操作,pq存储数组
//lambda 表达式设置优先级队列从大到小存储 o1-o2为 小顶堆,小的弹出 o2-o1 大顶堆,大的弹出
PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->o1[1]-o2[1]);
int[] res = new int[k];
Map<Integer, Integer> map = new HashMap<>();
for (int num: nums) map.put(num,map.getOrDefault(num,0)+1);
for (var x: map.entrySet())
{
int[] temp = new int[2];
temp[0] = x.getKey();
temp[1] = x.getValue();
//自动排序
pq.offer(temp);
//自己维护大小
if(pq.size()>k)
{
pq.poll();
}
}
for(int i=0; i<k; i++)
{
res[i]=pq.poll()[0];
}
return res;
}
}
三、运行结果
四、附录
二刷
class Solution
{
public int[] topKFrequent(int[] nums, int k)
{
Map<Integer,Integer> map1 = new HashMap<>();
int i;
int length;
length = nums.length;
for(i=0;i<length;i++)
{
map1.put(nums[i],map1.getOrDefault(nums[i],0)+1);
}
//map+优先级队列 结束 从小到大排列
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>()
{
@Override
public int compare(Integer a,Integer b)
{
return map1.get(a)-map1.get(b);
}
});
//System.out.println(" size "+pq.size());
for(Map.Entry<Integer,Integer> entry: map1.entrySet() )
{
int key = entry.getKey();
int value = entry.getValue();
//System.out.println(" key "+ key);
//System.out.println(" value "+ value);
if(pq.size()<k) pq.add(key);
else
{
if(map1.get(pq.peek())<map1.get(key))
{
pq.remove();
pq.add(key);
}
}
}
int[] res = new int[k];
for(i=0;i<k;i++)
{
res[i] = pq.peek();
pq.remove();
}
return res;
}
}