给定一个非空的整数数组,返回其中出现频率前 **k** 高的元素。 **示例 1:** ```js 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] ``` **示例 2:** ```js 输入: nums = [1], k = 1 输出: [1] ``` **提示:** - 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 - 你的算法的时间复杂度必须优于 O(nlogn) , n 是数组的大小。 - 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 - 你可以按任意顺序返回答案。 附赠leetcode地址:[leetcode](https://leetcode-cn.com/problems/top-k-frequent-elements/solution/javascript-qian-k-ge-gao-pin-yuan-su-by-user7746o/)
Activity
sisterAn commentedon Jun 5, 2020
解法一:map+数组
利用
map记录每个元素出现的频率,利用数组来比较排序元素代码实现:
复杂度分析:
题目要求算法的时间复杂度必须优于 O(n log n) ,所以这种实现不合题目要求
解法二:map + 小顶堆
遍历一遍数组统计每个元素的频率,并将元素值(
key)与出现的频率(value)保存到map中通过
map数据构建一个前k个高频元素小顶堆,小顶堆上的任意节点值都必须小于等于其左右子节点值,即堆顶是最小值。具体步骤如下:
key)与出现的频率(value)保存到map中map,将前k个数,构造一个小顶堆k位开始,继续遍历map,每一个数据出现频率都和小顶堆的堆顶元素出现频率进行比较,如果小于堆顶元素,则不做任何处理,继续遍历下一元素;如果大于堆顶元素,则将这个元素替换掉堆顶元素,然后再堆化成一个小顶堆。代码实现:
复杂度分析:
解法三:桶排序
这里取前k个高频元素,使用计数排序不再适合,在上题目中使用计数排序,将 i 元素出现的次数存储在
bucket[i],但这种存储不能保证bucket数组上值是有序的,例如bucket=[0,3,1,2],即元素0未出现,元素1出现3次,元素2出现1次,元素3出现2次,所以计数排序不适用于取前k个高频元素,不过,不用怕,计数排序不行,还有桶排序。桶排序是计数排序的升级版。它也是利用函数的映射关系。
桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
代码实现:
复杂度分析:
leetcode
7777sea commentedon Jun 5, 2020
大顶堆,哈希表都可以实现,放一下之前的答案吧
zhw2590582 commentedon Sep 30, 2021