当前位置: 首页 > news >正文

347. 前 K 个高频元素(中等)

347. 前 K 个高频元素

  • 1. 题目描述
  • 2.详细题解
  • 3.代码实现
    • 3.1 Python
    • 3.2 Java

1. 题目描述

题目中转:347. 前 K 个高频元素

在这里插入图片描述

2.详细题解

    寻找出现频率前 k k k高的元素,因此需要先统计各个元素出现的次数,该步骤时间复杂度为 O ( n ) O(n) O(n),再对各元素的出现频率进行排序,假定不同元素的个数为 m m m,该步骤的最佳时间复杂度为 O ( m l o g ( m ) ) O(mlog(m)) O(mlog(m)),如归并、堆排序等算法。
  这里介绍一种桶排序算法:桶排序(Bucket Sort)是一种排序算法,它通过将数据分散到有限数量的桶中,然后对每个桶中的数据单独进行排序,最后按照顺序将各个桶中的数据合并起来得到最终排序结果。简单的说,已知数据种类有限,逐一遍历数据并装入相应的桶中,仅需 O ( n ) O(n) O(n)时间复杂度即可完成数据排序。
  对于本题,先统计各元素出现的频率,再以元素的频率作为桶,将相应频率的元素放入指定桶中。具体算法如下:

  • Step1:初始化:统计各元素出现的频率,数据结构为字典,算法时间复杂度为 O ( n ) O(n) O(n)
  • Step2:数组中元素个数为 n n n,构建 n + 1 n+1 n+1个桶,数据结构为数组,数组的索引下标对应元素出现的频率(可进一步优化,桶的数据为元素出现的最大频率);
  • Step3:遍历各元素出现的频率,放入对应桶中,算法时间复杂度为 O ( m ) O(m) O(m)
  • Step4:从右至左遍历桶,如果桶中有元素,则放入最终结果:
  • Step5:当结果数量为 k k k时,程序结束;
  • Step8:返回结果。

3.代码实现

3.1 Python

class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:fre_dict = {}for num in nums:fre_dict[num] = fre_dict.get(num, 0) + 1res = [[] for _ in range(len(nums) + 1)]for key, value in fre_dict.items():res[value].append(key)ans = []for i in range(len(nums), 0, -1):if len(res[i]) > 0:ans.extend(res[i])if len(ans) == k:breakreturn ans

在这里插入图片描述

3.2 Java

class Solution {public int[] topKFrequent(int[] nums, int k) {int[] res = new int[k];HashMap<Integer, Integer> fre_dict = new HashMap();for (int num: nums){if (fre_dict.containsKey(num)){fre_dict.put(num, fre_dict.get(num)+1);}else {fre_dict.put(num, 1);}}List<Integer>[] list = new List[nums.length+1];for(int key : fre_dict.keySet()){// 获取出现的次数作为下标int i = fre_dict.get(key);if(list[i] == null){list[i] = new ArrayList();} list[i].add(key);}for (int i=list.length-1, j = 0; i>=0 && j < k; i--){if (list[i] == null) continue;for (int value: list[i]){res[j++] = value;}}return res;}
}

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Spring Boot】Spring原理:Bean的作用域和生命周期
  • 【CT】LeetCode手撕—8. 字符串转换整数 (atoi)
  • 建立共享linux第三方软件仓库
  • STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁
  • C++:组合和继承的区别
  • LeetCode HOT100(三)滑动窗口
  • 【Spring】springSecurity中WebSecurityConfigurerAdapter类中configure方法(5版本以下)
  • 2022 RoboCom省赛题目解析
  • Git: fatal: cannot lock ref‘HEAD‘: Unable to create
  • SQL 存储过程
  • 短视频矩阵:批量发布的秘密揭秘
  • SpringBoot常见注解
  • 数列分块<2>
  • int类型变量表示范围的计算原理
  • RISC-V指令集架构详细组成
  • 【Leetcode】101. 对称二叉树
  • 2017前端实习生面试总结
  • CSS 专业技巧
  • IDEA 插件开发入门教程
  • JAVA之继承和多态
  • JS学习笔记——闭包
  • leetcode388. Longest Absolute File Path
  • sublime配置文件
  • ViewService——一种保证客户端与服务端同步的方法
  • windows-nginx-https-本地配置
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 聊聊flink的TableFactory
  • 如何在 Tornado 中实现 Middleware
  • 算法系列——算法入门之递归分而治之思想的实现
  • 06-01 点餐小程序前台界面搭建
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​Java并发新构件之Exchanger
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define,static,const,三种常量的区别
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (LeetCode C++)盛最多水的容器
  • (六)Hibernate的二级缓存
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)mysql_MYSQL(三)
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)VirtualBox安装增强功能
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (正则)提取页面里的img标签
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Scala的“=”符号简介
  • (转)创业的注意事项
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core 微服务之Consul(二)-集群搭建