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?