【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;
    }
}

运行结果

【leetcode】347. Top K Frequent Elements_第1张图片

使用桶排序

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;
    }
}

运行结果

【leetcode】347. Top K Frequent Elements_第2张图片

你可能感兴趣的:(leetcode)