首页 > 其他分享 >LeetCode 347. 前 K 个高频元素

LeetCode 347. 前 K 个高频元素

时间:2023-05-14 19:34:55浏览次数:42  
标签:nums int 下界 次数 计数 347 哈希 高频 LeetCode

题目链接:LeetCode 347. 前 K 个高频元素

题意:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

解题思路:

(哈希表,计数排序) O(n)

  1. 首先用哈希表统计出所有数出现的次数。
  2. 由于所有数出现的次数都在 1 到 n 之间,所以我们可以用计数排序的思想,统计出次数最多的前 k 个元素的下界。
  3. 然后将所有出现次数大于等于下界的数输出。

时间复杂度分析:用哈希表统计每个数出现次数的计算量是 O(n),计数排序的计算量是 O(n),最终用下界过滤结果的计算量也是 O(n),所以总时间复杂度是 O(n)。

完整代码如下:

func topKFrequent(nums []int, k int) []int {
    // 首先用哈希表统计出所有数出现的次数。
    // 由于所有数出现的次数都在 1 到 n之间,所以我们可以用计数排序的思想,统计出次数最多的前 k 个元素的下界。
    // 然后将所有出现次数大于等于下界的数输出。
    // 时间复杂度分析:用哈希表统计每个数出现次数的计算量是 O(n),计数排序的计算量是 O(n),最终用下界过滤结果的计算量也是 O(n),所以总时间复杂度是 O(n)

    count:=map[int]int{}//统计每个元素出现多少次
    
    for _ ,v :=range nums{  //用哈希表统计每个数出现次数的计算量是 O(n)
        count[v]++    
    }
    n:=len(nums)+1
    s:=make([]int,n) //表示出现每种次数的元素的个数是多少
    for _,v:=range count{   //计数排序
        s[v]++
    }
    i:=len(nums)
    t:=0
    for t < k{     //得到前k个的分界线
        t += s[i]
        i--
    }
    var res []int
    for k,v:=range count{  // 最终用下界过滤结果
        if v > i{
            res = append(res,k)
        }
    }
    return res

}

标签:nums,int,下界,次数,计数,347,哈希,高频,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17399955.html

相关文章

  • 代码随想录day4|leetcode24,19,142
    Leetcode24我一开始是直接模拟,通过考虑后面有没有secondpoint和thirdpoint的情况下进行的编程,非常的冗长。后面阅读了推荐的答案,发现在编写链表题目的时候,可以使用虚拟头节点,这样写出来的结果非常的简洁明了,并且一二两个就可以开始重复进行 关于判断语句的如果是and连接......
  • LeetCode 239. 滑动窗口最大值
    题目链接:LeetCode239.滑动窗口最大值题意:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。解题思路:(单调队列)O(n)使用单调队列求解......
  • LeetCode 150. 逆波兰表达式求值
    题目链接:LeetCode150.逆波兰表达式求值题意:给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。解题思路:(栈操作)O(n)遍历所有元素。如果当前元素是整数,则压入栈;如果是运算符,则将栈顶两个元素弹出......
  • LeetCode 1047. 删除字符串中的所有相邻重复项
    题目链接:LeetCode1047.删除字符串中的所有相邻重复项题意:给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。解题思路:开一个栈,然后扫描整个字符串。如果当前字符和栈顶元素不相等,则当前......
  • LeetCode 20. 有效的括号
    题目链接:LeetCode20.有效的括号题意:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。解题思路:括号匹配是栈的经典应用场景,具体操作如下:1.对于所有的左括号,进栈2.对于所有的右括号,弹出栈顶元素,判断是否与当前元素匹配,若不匹配,则returnfalse3.最后......
  • 电机控制器,异步电机的旋转高频电压注入算法FOC,全套C代码+仿真模型,已经在实际的工程项
    电机控制器,异步电机的旋转高频电压注入算法FOC,全套C代码+仿真模型,已经在实际的工程项目项目中加以应用:1.在定子电压的两相同步静止坐标系(α,β轴)下注入旋转高频电压,然后通过转子位置观测器实现转子机械转速与转子磁链电角度的精确估算;2.能够实现电机低速段带重载运行工况下的高精......
  • LeetCode --- 二叉树操作
    543. 二叉树的直径乍看是根节点的左子树最大高度+右子树最大高度+1但其实不能这样,因为路径可能并不经过根节点,如图二因此要用一个max来保存最后的最大路径和在求二叉树高度的递归中,在每个根节点(在递归函数中),比较max与以这个当前根节点的  左子树最大高度+右子......
  • 2023-05-14 leetcode竞赛
    6430. 找出转圈游戏输家mysolution100%passclassSolution:defcircularGameLosers(self,n:int,k:int)->List[int]:seen=set()now_num=1step=1seen.add(1)while1:stepSum=step*ktotal=......
  • leetcode 1604. 警告一小时内使用相同员工卡大于等于三次的人
    力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个警告 。给你字符串数组 keyName 和 keyTime,其中 [keyName[i],keyTime[i......
  • LeetCode 刷题 —— 辅助栈
     42. 接雨水classSolution{publicinttrap(int[]height){intres=0;Stack<Integer>leftWallStack=newStack();intlen=height.length;leftWallStack.push(0);for(inti=1;i<len;i++){......