zoukankan      html  css  js  c++  java
  • LeetCode–前 K 个高频元素

    LeetCode–前 K 个高频元素

    博客说明

    文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

    介绍

    347. 前 K 个高频元素

    题目

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

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

    提示:

    你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
    你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
    题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。
    你可以按任意顺序返回答案。
    

    思路

    • 首先遍历整个数组,并使用哈希表记录每个数字出现的次数,并形成一个「出现次数数组」。找出原数组的前 kk 个高频元素,就相当于找出「出现次数数组」的前 kk 大的值。

    • 最简单的做法是给「出现次数数组」排序。但由于可能有 O(N)O(N) 个不同的出现次数(其中 NN 为原数组长度),故总的算法复杂度会达到 O(Nlog N)O(NlogN),不满足题目的要求。

    • 在这里,我们可以利用堆的思想:建立一个小顶堆,然后遍历「出现次数数组」:

      • 如果堆的元素个数小于 kk,就可以直接插入堆中。
      • 如果堆的元素个数等于 kk,则检查堆顶与当前出现次数的大小。如果堆顶更大,说明至少有 kk 个数字的
      • 出现次数比当前值大,故舍弃当前值;否则,就弹出堆顶,并将当前值插入堆中。
      • 遍历完成后,堆中的元素就代表了「出现次数数组」中前 kk 大的值

    代码

    class Solution {
        public int[] topKFrequent(int[] nums, int k) {
            Map<Integer,Integer> occ = new HashMap<Integer,Integer>();
            for (int num : nums) {
                occ.put(num,occ.getOrDefault(num,0)+1);
            }
            PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    return o1[1] - o2[1];
                }
            });
            for (Map.Entry<Integer, Integer> integerIntegerEntry : occ.entrySet()) {
                int num = integerIntegerEntry.getKey();
                int count = integerIntegerEntry.getValue();
                if(queue.size() == k){
                    if(queue.peek()[1] < count){
                        queue.poll();
                        queue.offer(new int[]{num,count});
                    }
                }else {
                    queue.offer(new int[]{num,count});
                }
            }
            int[] ret = new int[k];
            for (int i = 0; i < k; i++) {
                ret[i] = queue.poll()[0];
            }
            return ret;
        }
    }
    

    感谢

    Leetcode

    以及勤劳的自己,个人博客GitHub

    微信公众号

  • 相关阅读:
    购买 Linux VPS 服务器后简单的安全设置
    VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试
    Polysh实现多服务器批量执行shell
    第十一周编程总结
    第十周作业
    第九周编程总结修改
    第九周编程总结
    第八周编程总结
    第7周编程总结
    第七周编程总结啊
  • 原文地址:https://www.cnblogs.com/guizimo/p/13627813.html
Copyright © 2011-2022 走看看