【leetcode】347. Top K Frequent Elements

思路

我的想法是用一张表来记录出现的数字及对应出现的次数。然后对所有数字的出现次数排名。
然后出现排名前k的数字就是目标数字。

提交代码
class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map=new HashMap<>();
        List<Integer> res=new ArrayList<>();
        
        for(int num:nums)
        	map.put(num, map.getOrDefault(num, 0)+1);
       
        int[] rank=new int[map.size()];
        int i=0;
        for(Integer value: map.values()) {
        	rank[i++] = value; 
        }
        
        Arrays.sort(rank);
        for(int j=rank.length-1;res.size()<k;j--) {
        	for(Map.Entry<Integer, Integer> entry: map.entrySet()) {
        		if(entry.getValue()==rank[j]) {
        			res.add(entry.getKey());
        			map.remove(entry.getKey());
        			break;
        		}
        	}
        	
        }
        
        return res;
    }
}
运行结果

在这里插入图片描述

使用桶排序
class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
    	HashMap<Integer, Integer> fMap=new HashMap<>();
    	for(int num:nums) 
    		fMap.put(num, fMap.getOrDefault(num, 0)+1);
    	
    	List<Integer>[] bucket = new List[nums.length+1];
    	for(int i=0;i<nums.length+1;i++) {
    		bucket[i]=new ArrayList<>();
    	}

    	for(Map.Entry<Integer, Integer> entry:fMap.entrySet()) {
    		bucket[entry.getValue()].add(entry.getKey());
    	}
    	
    	List<Integer> res=new ArrayList<>();
    	int cnt = 0;
    	for(int i=nums.length;i>0;i--) {
    		if(bucket[i]==null||bucket[i].size()==0)	continue;
    		for(int j=0; j<bucket[i].size()&&cnt<k;j++,cnt++)
    			res.add(bucket[i].get(j));
    	}
    	
    	return res;
    }
}
运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值