leetcode-前k个高频元素-java

题目描述:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

思想:使用桶排序,先将数组中的元素遍历到map中,key为元素,value为元素出现的次数。再声明一个bucket,将元素存在出现频率作为下标的位置,从后向前遍历bucket,直到结果集中的元素个数达到k。

class Solution {
	//这个题之前是返回一个List
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int index = 0;
        for (int i :nums){
        	//key为元素,value为频数
            map.put(i,map.getOrDefault(i,0)+1);
        }
        List<Integer>[] bucket =new ArrayList[nums.length+1];
        for (int key :map.keySet()){
            int frequency = map.get(key);
            if (bucket[frequency] == null){
                bucket[frequency] = new ArrayList<>();
            }
            bucket[frequency].add(key);
        }
        List<Integer> resultList = new ArrayList<>();
        for (int i = bucket.length-1;i > 0;i--){
            if (bucket[i] == null){
                continue;
            }
            //如果该bucket中的元素个数小于等于需要的个数,就全部添加
            if (bucket[i].size() <= (k - resultList.size())){
                resultList.addAll(bucket[i]);
            }else{
            //否则就只添加需要的个数
                resultList.addAll(bucket[i].subList(0,k-resultList.size()));
            }
        }
        //转为数组
        int[] result = new int[k];
        for(int i :resultList){
            result[index] = i;
            index++;
        }
        return result;
    }
}

你可能感兴趣的:(LeetCode)