其他分享
首页 > 其他分享> > LeetCode——剑指 Offer II 060. 出现频率最高的 k 个数字

LeetCode——剑指 Offer II 060. 出现频率最高的 k 个数字

作者:互联网

出现频率最高的 k 个数字

题目

给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。

思路

先利用一个hashmap来统计各个数字的个数,然后,将这个哈希表转化为一个优先队列,根据计数数字的大小来作为优先级判断。最终,优先队列的前k个元素就是所要寻找的答案!

代码

import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.TreeMap;
// 自定义元素
class Element
{
    int num;
    int count;
    public Element(int num,int count)
    {
        this.num=num;
        this.count=count;
    }

    @Override
    public String toString() {
        return "Element{" +
                "num=" + num +
                ", count=" + count +
                '}';
    }
}
// 自定义排序规则
class  MyCmp implements Comparator<Element>
{
    @Override
    public int compare(Element o1, Element o2) {
        return o2.count-o1.count;
    }
}
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        PriorityQueue<Element> priorityQueue = new PriorityQueue<>(new MyCmp());
        int length = nums.length;
        // 利用一个哈希表来统计数字的个数
        for(int i=0;i<length;++i)
        {
            if(!map.containsKey(nums[i]))
                map.put(nums[i],1);
            else
                map.put(nums[i],map.get(nums[i])+1);
        }
        // 将哈希表转化为优先队列
        for (Integer n: map.keySet())
        {
            priorityQueue.add(new Element(n,map.get(n)));
        }
        int ans[]=new int[k];
        for (int i=0;i<k;++i)
        {
            ans[i]=priorityQueue.poll().num;
        }
        return ans;
    }
}

结果

在这里插入图片描述
目前没有什么更优的想法!

标签:count,060,Offer,int,nums,Element,II,map,num
来源: https://blog.csdn.net/weixin_44750790/article/details/120157887