优先队列的使用 频率前K个


优先队列的使用 频率前K个

力扣题目链接:https://leetcode-cn.com/problems/top-k-frequent-elements/


创建优先队列:

//其实本质上来说,优先队列就是一个大根堆或者是个小根堆
PriorityQueue pq = new PriorityQueue<>(new Comparator() {
    @Override
    public int compare(Integer a, Integer b) {
        return mp.get(a) - mp.get(b);//这样返回就是小顶堆
        //return mp.get(b) - mp.get(a);//这样返回就是大顶堆
    }
});//建立一个优先队列,里面存的是每个数

解题思路:

1.先将数组里的数和该数出现的频率存到HashMap里

Map mp=new HashMap<>();
	for(int x:nums){
    mp.put(x,mp.getOrDefault(x,0)+1);
}//把nums里面的数字和出现的频率存到mp里面去

2.遍历map,用最小堆保存频率最大的k个元素

PriorityQueue pq = new PriorityQueue<>(new Comparator() {
    @Override
    public int compare(Integer a, Integer b) {
        return mp.get(a) - mp.get(b);//这样返回就是小顶堆
        //return mp.get(b) - mp.get(a);//这样返回就是大顶堆
    }
});//建立一个优先队列,里面存的是每个数

3.维护这个pq优先队列

for(int x:mp.keySet()){
	if(pq.size()

4.最后逆序输入到输出数组res中即可

int[] res=new int[k];
for(int i=k-1;i>=0;i--){
	res[i]=pq.remove();
}

三:实现代码:

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map mp=new HashMap<>();
        for(int x:nums){
            mp.put(x,mp.getOrDefault(x,0)+1);
        }//把nums里面的数字和出现的频率存到mp里面去

       // 遍历map,用最小堆保存频率最大的k个元素
        PriorityQueue pq = new PriorityQueue<>(new Comparator() {
            @Override
            public int compare(Integer a, Integer b) {
                return mp.get(a) - mp.get(b);//这样返回就是小顶堆
                //return mp.get(b) - mp.get(a);//这样返回就是大顶堆
            }
        });//建立一个优先队列,里面存的是每个数
        int[] res=new int[k];
        for(int x:mp.keySet()){
            if(pq.size()=0;i--){
            res[i]=pq.remove();
        }
        return res;
    }
}

解题总结

这是一道利用数据结构的题目,可见在解算法题的过程中。

不要忽视代码本身数据结构的强大,单调队列,单调栈和哈希表都是比较常用的数据结构。

附上解题结果,好慢啊,不过这题还行,你学废了嘛?