本文首发于公众号「五分钟学算法」,是图解 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 log⁡n) ,而题目要求算法的时间复杂度必须优于 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(nlog⁡k) 。
  • 空间复杂度: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 个高频元素相关推荐

  1. [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]

    [问题描述][中等] [解答思路] 1. 堆 复杂度 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Inte ...

  2. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    更多 LeetCode 题解笔记可以访问我的 github. 文章目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java ...

  3. 堆排序:大顶堆和小顶堆 + 前K个高频元素

    堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...

  4. leetcode:前 K 个高频元素、删除字符串中的所有相邻重复项、有多少小于当前数字的数字、有效的山脉数组、独一无二的出现次数(JavaScript)

    文章目录 347. 前 K 个高频元素 思路 1047. 删除字符串中的所有相邻重复项 思路 1365. 有多少小于当前数字的数字 思路 优化 继续优化 完整代码 941. 有效的山脉数组 思路 12 ...

  5. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

    一.239. 滑动窗口最大值 from collections import dequeclass MyQueue: #单调队列(从大到小def __init__(self):self.queue = ...

  6. 前K个高频元素(top k)(TX)

    思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...

  7. 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=

    2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...

  8. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements

    leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...

  9. Leetcode 347. 前 K 个高频元素

    Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...

最新文章

  1. Linux-6.5下 MariaDB-10基于percona-XtraBackup备份工具的原理及配置详解
  2. Android PullToRefreshListView和ViewPager的结合使用
  3. 现代微波滤波器结构与设计_高功率射频及微波无源器件中的考虑和限制
  4. UOS系统下FFmpeg源码编译安装及注意事项
  5. 仓库处理中 无法修改_上海电商仓储物流公司,冷链仓库-上海玖日仓储
  6. 14 WM配置-主数据-定义存储单位类型(Storage Unit Type)
  7. eas软标签_商品防盗尤为重视,防盗软标签突显本质优势
  8. Android Multimedia框架总结(十六)Camera2框架之openCamera及session过程
  9. STM32CAN波特率简易计算
  10. Java英文单词翻译(API文档,IDE以及基本的java英文)
  11. 常用元器件封装的命名规范-002
  12. Matlab计算轮廓内切圆
  13. Unity 5.3 官方VR教程(—)VR综述
  14. 欢迎西南大学人工智能学院加入RICAI !!
  15. 异常:could not initialize proxy - the owning Session
  16. XCode 报错Thread 2:signal SIGABRT
  17. Android github上优秀开源项目分类汇总
  18. 51nod 1299 监狱逃离 树形dp/最小割
  19. poj 4084:拓扑排序
  20. mysql 自动复制_MySQL 复制搭建(附mysql自动搭建脚本)

热门文章

  1. 36岁,程序员,为公司工作8年,昨天HR说公司不准备续约
  2. iphone怎么看wifi密码_无线网密码正确但是手机连接不上wifi怎么回事?
  3. 嵌入式开发板01---点亮LED
  4. 监督学习 | 集成学习 之AdaBoost、梯度提升及Slearn实现
  5. 吴恩达机器学习笔记三之逻辑回归
  6. 对于 AttributeError: 'Series' object has no attribute 'sort'的解决办法
  7. python匿名函数调用_python中引用局部变量的匿名函数
  8. 1288:三角形最佳路径问题-2019-07-04
  9. python定时执行脚本实例
  10. PHP笔记-文件上传例子