力扣-10.2-347

在这里插入图片描述

桶排序

class Solution {
    
    
    public int[] topKFrequent(int[] nums, int k) {
    
    
        Map<Integer, Integer> frequencyOfNums=new HashMap<Integer, Integer>();
		for(int num:nums) {
    
    
			frequencyOfNums.put(num, frequencyOfNums.getOrDefault(num, 0)+1);
		}
		//for循环结束,所有的数的频率就计算出来了
		
		List<Integer>[] buckets=new ArrayList[nums.length+1];
		for(int num:frequencyOfNums.keySet()) {
    
    
			int frequency=frequencyOfNums.get(num);
			if(buckets[frequency]==null) {
    
    
				buckets[frequency]=new ArrayList<Integer>();
			}
			buckets[frequency].add(num);
		}
		List<Integer> topK=new ArrayList<Integer>();
		for(int i=buckets.length-1;i>=0 && topK.size()<k;i--) {
    
    
			if(buckets[i]==null) {
    
    
				continue;
			}
			if(buckets[i].size()<=(k-topK.size())) {
    
    
				topK.addAll(buckets[i]);
			}else {
    
    
				topK.addAll(buckets[i].subList(0, k-topK.size()));
			}
		}
		return topK.stream().mapToInt(Integer::intValue).toArray();
    }
}

设置若干个桶,每个桶存储出现频率相同的数。桶的下标表示数出现的频率,即第 i 个桶中存储的数出现的频率为 i。
把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数。

注意:

  • 将Integer型的列表转换为int[]类型的数组使用列表.stream().mapToInt(Integer::intValue).toArray();
  • 列表转换为数组使用toArray()方法
  • 数组转化为列表使用asList()方法

猜你喜欢

转载自blog.csdn.net/Desperate_gh/article/details/108902760
347