统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素
本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。
个人网站:https://www.cxyxiaowu.com
今天分享的题目来源于 LeetCode 上第 347 号问题:前 K 个高频元素。题目难度为 Medium,目前通过率为 56.9% 。
题目描述
给定一个非空的整数数组,返回其中出现频率前 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 个元素。
以下十种排序算法,任你挑选!
可以发现,使用常规的诸如 冒泡、选择、甚至快速排序都是不满足题目要求,它们的时间复杂度都是大于或者等于 O(n logn) ,而题目要求算法的时间复杂度必须优于 O(n log n) 。
复杂度分析
- 时间复杂度:O(nlogn),n 表示数组长度。首先,遍历一遍数组统计元素的频率,这一系列操作的时间复杂度是 O(n);接着,排序算法时间复杂度为O(nlogn) ;因此整体时间复杂度为 O(nlogn) 。
- 空间复杂度:O(n),最极端的情况下(每个元素都不同),用于存储元素及其频率的 Map 需要存储 n 个键值对。
解法二:最小堆
题目最终需要返回的是前 k 个频率最大的元素,可以想到借助堆这种数据结构,对于 k 频率之后的元素不用再去处理,进一步优化时间复杂度。
具体操作为:
- 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
- 维护一个元素数目为 k 的最小堆
- 每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
- 如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
- 最终,堆中的 k 个元素即为前 k 个高频元素
代码如下:
class
复杂度分析
- 时间复杂度:O(nlogk), n 表示数组的长度。首先,遍历一遍数组统计元素的频率,这一系列操作的时间复杂度是 O(n);接着,遍历用于存储元素频率的 map,如果元素的频率大于最小堆中顶部的元素,则将顶部的元素删除并将该元素加入堆中,这里维护堆的数目是 k ,所以这一系列操作的时间复杂度是 O(nlogk)的;因此,总的时间复杂度是 O(nlogk) 。
- 空间复杂度:O(n),最坏情况下(每个元素都不同),map 需要存储 n 个键值对,优先队列需要存储 k个元素,因此,空间复杂度是 O(n)。
解法三:桶排序法
首先依旧使用哈希表统计频率,统计完成后,创建一个数组,将频率作为数组下标,对于出现频率不同的数字集合,存入对应的数组下标即可。
代码实现如下:
//基于桶排序求解「前 K 个高频元素」
复杂度分析
- 时间复杂度:O(n), n 表示数组的长度。首先,遍历一遍数组统计元素的频率,这一系列操作的时间复杂度是 O(n);桶的数量为 n + 1,所以桶排序的时间复杂度为 O(n);因此,总的时间复杂度是 O(n)。
- 空间复杂度:很明显为 O(n)
统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素相关推荐
- [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]
[问题描述][中等] [解答思路] 1. 堆 复杂度 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Inte ...
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
更多 LeetCode 题解笔记可以访问我的 github. 文章目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java ...
- 堆排序:大顶堆和小顶堆 + 前K个高频元素
堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...
- leetcode:前 K 个高频元素、删除字符串中的所有相邻重复项、有多少小于当前数字的数字、有效的山脉数组、独一无二的出现次数(JavaScript)
文章目录 347. 前 K 个高频元素 思路 1047. 删除字符串中的所有相邻重复项 思路 1365. 有多少小于当前数字的数字 思路 优化 继续优化 完整代码 941. 有效的山脉数组 思路 12 ...
- 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素
一.239. 滑动窗口最大值 from collections import dequeclass MyQueue: #单调队列(从大到小def __init__(self):self.queue = ...
- 前K个高频元素(top k)(TX)
思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...
- 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=
2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...
- 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...
- Leetcode 347. 前 K 个高频元素
Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...
最新文章
- Linux-6.5下 MariaDB-10基于percona-XtraBackup备份工具的原理及配置详解
- Android PullToRefreshListView和ViewPager的结合使用
- 现代微波滤波器结构与设计_高功率射频及微波无源器件中的考虑和限制
- UOS系统下FFmpeg源码编译安装及注意事项
- 仓库处理中 无法修改_上海电商仓储物流公司,冷链仓库-上海玖日仓储
- 14 WM配置-主数据-定义存储单位类型(Storage Unit Type)
- eas软标签_商品防盗尤为重视,防盗软标签突显本质优势
- Android Multimedia框架总结(十六)Camera2框架之openCamera及session过程
- STM32CAN波特率简易计算
- Java英文单词翻译(API文档,IDE以及基本的java英文)
- 常用元器件封装的命名规范-002
- Matlab计算轮廓内切圆
- Unity 5.3 官方VR教程(—)VR综述
- 欢迎西南大学人工智能学院加入RICAI !!
- 异常:could not initialize proxy - the owning Session
- XCode 报错Thread 2:signal SIGABRT
- Android github上优秀开源项目分类汇总
- 51nod 1299 监狱逃离 树形dp/最小割
- poj 4084:拓扑排序
- mysql 自动复制_MySQL 复制搭建(附mysql自动搭建脚本)
热门文章
- 36岁,程序员,为公司工作8年,昨天HR说公司不准备续约
- iphone怎么看wifi密码_无线网密码正确但是手机连接不上wifi怎么回事?
- 嵌入式开发板01---点亮LED
- 监督学习 | 集成学习 之AdaBoost、梯度提升及Slearn实现
- 吴恩达机器学习笔记三之逻辑回归
- 对于 AttributeError: 'Series' object has no attribute 'sort'的解决办法
- python匿名函数调用_python中引用局部变量的匿名函数
- 1288:三角形最佳路径问题-2019-07-04
- python定时执行脚本实例
- PHP笔记-文件上传例子