美文网首页算法代码
前K个高频元素

前K个高频元素

作者: windUtterance | 来源:发表于2020-05-18 12:12 被阅读0次

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

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

    Java代码

    class Solution {
        //HashMap+堆排序
        public List<Integer> topKFrequent(int[] nums, int k) {
            // 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值
            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);
                 }
            }
            // 遍历map,用最小堆保存频率最大的k个元素
            PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
                @Override
                public int compare(Integer a, Integer b) {
                    return map.get(a) - map.get(b);
                }
            });
            for (Integer key : map.keySet()) {
                if (pq.size() < k) {
                    pq.add(key);
                } else if (map.get(key) > map.get(pq.peek())) {
                    pq.remove();
                    pq.add(key);
                }
            }
            // 取出最小堆中的元素
            List<Integer> res = new ArrayList<>();
            while (!pq.isEmpty()) {
                res.add(pq.remove());
            }
            return res;
        }
    }
        //桶排序
        public List<Integer> topKFrequent(int[] nums, int k) {
            List<Integer> res = new ArrayList();
            // 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值
            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>[] list = new List[nums.length+1];
            for(int key : map.keySet()){
                // 获取出现的次数作为下标
                int i = map.get(key);
                if(list[i] == null){
                   list[i] = new ArrayList();
                } 
                list[i].add(key);
            }
            
            // 倒序遍历数组获取出现顺序从大到小的排列
            for(int i = list.length - 1;i >= 0 && res.size() < k;i--){
                if(list[i] == null) continue;
                res.addAll(list[i]);
            }
            return res.stream().mapToInt(Integer::valueOf).toArray();
        }
    
    作者:MisterBooo
    链接:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/leetcode-di-347-hao-wen-ti-qian-k-ge-gao-pin-yuan-/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    相关文章

      网友评论

        本文标题:前K个高频元素

        本文链接:https://www.haomeiwen.com/subject/vcquohtx.html