347. 前 K 个高频元素

https://leetcode-cn.com/problems/top-k-frequent-elements/

题目描述

方法 1:哈希表

思路

  • 遍历一遍数组,用哈希表统计每个数字出现的次数。

  • 按次数排序,然后输出前 k 个数字。

复杂度分析

  • 时间复杂度:$O(mlogm)$,m 是数组中不同数字的数量,最大是 N,数组的长度,这是排序的时间。

  • 空间复杂度:$O(m)$,m 是数组中不同数字的数量,哈希表的空间。

代码

JavaScript Code

方法 2:大顶堆

思路

看到 前 k 个 这种描述就能想到 了,还是先把数字出现的次数统计在哈希表中,然后入堆按次数排序,再吐出来 k 个。

复杂度分析

  • 时间复杂度:$O(klogm)$,m 是数组中不同数字的数量,堆中有 m 个元素,移除堆顶的时间是 $logm$,重复操作了 k 次。

  • 空间复杂度:$O(m)$,m 是数组中不同数字的数量,哈希表和堆的空间。

代码

JavaScript Code

方法 3:小顶堆

思路

统计每个数字出现的次数后,维护一个大小为 k 的小顶堆。

复杂度分析

  • 时间复杂度:$O(klogk)$。

  • 空间复杂度:$O(m)$,m 是数组中不同数字的数量,哈希表的空间,小顶堆的空间是 $O(k)$,m >= k

代码

JavaScript Code

方法 4:快速选择

思路

https://github.com/suukii/Articles/blob/master/articles/dsa/quick_select.md

复杂度分析

  • 时间复杂度:$O(N)$,平均是 $O(N)$,虽然理论上最差情况是 $O(N^2)$,但实际应用的话效率还是不错的。

  • 空间复杂度:$O(N)$,哈希表的空间是 $O(m)$,m 是数组中不同数字的数量。快速选择中递归栈最差应该是 $O(N)$。

代码

JavaScript Code

Last updated

Was this helpful?