LeetCode 347. 前 K 个高频元素

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        //使用HashMap统计每个元素出现的次数,元素为键,元素出现的频次为值
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int num : nums){
            if(map.containsKey(num)){
                map.put(num,map.get(num) + 1);
            }else{
                map.put(num,1);
            }
        }
        //桶排序
        //将频次作为数组的下标,对于出现频次不同的数字集合,存入相应的数组下标
        List<Integer>[] buckets = new ArrayList[nums.length + 1];
        for(int key : map.keySet()){
            //获取出现的次数作为下标
            int i = map.get(key);
            if(buckets[i] == null){
                buckets[i] = new ArrayList();
            }
            buckets[i].add(key);
        }
        // topK用于保存 频率前K高的元素
        List<Integer> topK = new ArrayList();
        //倒序遍历数组获取出现顺序从大到小的排列
        for(int i = buckets.length - 1;i >= 0 && topK.size() < k;i--){
            if(buckets[i] == null) {
                continue;
            };
            //如果buckets[i]的容量 小于k - topK.size(),全放到topK List中
            if(buckets[i].size() <= (k - topK.size())){
                topK.addAll(buckets[i]);
            }else{
                //容量不够了,放 0 ~ k - topK.size()个
                topK.addAll(buckets[i].subList(0,k - topK.size()));
            }
        }
        //定义结果集res,将List转为数组输出
        int[] res = new int[k];
        for(int i =0;i < k;i++){
            res[i] = topK.get(i);
        }
        return res;
    }
}

 

posted @ 2020-11-02 14:50  peanut_zh  阅读(113)  评论(0编辑  收藏  举报