zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    04.sys
    leetcode算法-加油站
    Spring动态AOP
    (java反射-JDK动态代理)+CGLIB动态代理
    java反射-基础语法
    leetcode算法-验证回文串
    leetcode算法-盛最多水的容器
    leetcode算法-两数之和
    leetcode算法-三数之和
    leetcode算法-最长和谐子序列
  • 原文地址:https://www.cnblogs.com/peanut-zh/p/13914415.html
Copyright © 2011-2022 走看看