首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

K 高频元素告诉你桶排序有啥用

题目描述 给定一非空的整数数组,返回其中出现频率 k 高的元素。...题目解析 解法一:最小堆 题目最终需要返回的是 k 频率最大的元素,可以想到借助堆这种数据结构,对于 k 频率之后的元素不用再去处理。 ?...具体操作为: 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率 维护一元素数目为 k 的最小堆 每次都将新的元素与堆顶元素(堆中频率最小的元素进行比较 如果新的元素的频率比堆顶端的元素大...,则弹出堆顶端的元素,将新的元素添加进堆中 最终,堆中的 k 元素即为 k 高频元素 ?...代码实现如下: //基于桶排序求解「 K 高频元素」 class Solution { public List topKFrequent(int[] nums, int k

99330
您找到你想要的搜索结果了吗?
是的
没有找到

LeetCode-347-K高频元素

# LeetCode-347-K高频元素 给定一非空的整数数组,返回其中出现频率 k 高的元素。...,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中 k 高频元素的集合是唯一的。 你可以按任意顺序返回答案。...# 解题思路 方法1、最小堆: 首先利用Map来计算数组中数字出现的频率 之后利用一优先队列,在存储的过程中按照频率进行排序,且只存储频率最高的K个数 由于题目要求的顺序可以不同,所以最后一次弹出queue...第二步建立堆,堆中添加一元素的复杂度是 O(log(k)),要进行 N 次复杂度是 O(N)。 最后一步是输出结果,复杂度为 O(klog(k))。第二步和最后一步复杂度综合O(Nlog(k))。

19420

力扣LeetCode, K 高频元素

1、优先队列的经典问题,在1000000元素中选出100名元素,题型模式如在N元素中选出M元素。   ...在这里面的关键就是M远远小于N的,如果M是1,是很简单的,只需要遍历一遍,此时时间复杂度是O(n)级别的,但是此时要选出M元素,如果M不等于1的话,就有点麻烦了,此时也可以将100万元素进行一下排序...,对于100万元素,使用归并排序还是快速排序,都可以在O(NlogN)的时间复杂度内完成任务,排序之后可以直接取出一百名元素。   ...需要注意的是这里虽然要选出M元素M元素默认是M最大的元素,但是实际上需要的是一最小堆,我们要能够非常快速的取出当前看到的M元素中的最小的那个元素,我们不断的将当前可以看到的M大的元素中那个最小的元素进行替换...,是我们当前看到的k频次最高的元素, 103 // 此时,新遍历的一key,此时这个key的频次可能比当前这k频次最高的元素中 104

63410

力扣347—— K 高频元素

这道题主要涉及的是对数据结构里哈希表、小顶堆的理解,优化时可以参考一些排序方法。 原题 给定一非空的整数数组,返回其中出现频率 k 高的元素。...此处的时间复杂度为O(n) 其次,因为需要查找频率 k 高的元素,所以我们肯定是需要排序的,时间复杂度为O(n log n)的排序方法有许多,快速排序、堆排序等,我是用的堆排序,使用小顶堆,这样在每次入堆的时候...桶排序优化 针对排序,我想到了一优化,利用桶排序,其时间复杂度为O(n),主要是浪费空间,因为需要申请额外的数组,下标代表出现的次数,元素我用的是 LinkedList,这样可以存储多个。...那么这个在进行输出时,只要从后往前进行遍历,当结果的数量达到 k 时,就可以停止了。...array[count] = list; } list.add(key); } // 倒着遍历数组,直到找到K元素

36030

LeetCode-347-K高频元素

# LeetCode-347-K高频元素 给定一非空的整数数组,返回其中出现频率 k 高的元素。...总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...题目数据保证答案唯一,换句话说,数组中 k 高频元素的集合是唯一的。 你可以按任意顺序返回答案。...# 解题思路 方法1、最小堆: 首先利用Map来计算数组中数字出现的频率 之后利用一优先队列,在存储的过程中按照频率进行排序,且只存储频率最高的K个数 由于题目要求的顺序可以不同,所以最后一次弹出queue...第二步建立堆,堆中添加一元素的复杂度是 O(log(k)),要进行 N 次复杂度是 O(N)。 最后一步是输出结果,复杂度为 O(klog(k))。第二步和最后一步复杂度综合O(Nlog(k))。

18810

golang刷leetcode K 高频元素

给你一整数数组 nums 和一整数 k ,请你返回其中出现频率 k 高的元素。你可以按 任意顺序 返回答案。...<= 105 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中 k 高频元素的集合是唯一的 进阶:你所设计算法的时间复杂度 必须 优于 O(n log...h.data[i] i=l }else{ break } } } 源码: 解法二: 解题思路 1,将数组转化成数字、频次对 2,我们知道快速排序的复杂度是...nlogn,且每一次排序后,pivot前面的元素都比pivot大,后面的都比pivot小 3,类比这个思路: A,pivot==k,pivot前面的元素就是所求,得解 B,pivot>k,我们继续在...0到 pivot 之间寻找 C,pivot<k 我们在pivot 和len之间寻找 4,所以可以结合快速排序来求结果 源码: func topKFrequent(nums []int, k int)

22310

LeetCode 347: K 高频元素 Top K Frequent Elements

题目: 给定一非空的整数数组,返回其中出现频率 K 高的元素。...总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。...解题思路: 这道题大致解题步骤是: 频率统计 --> 按频率排序 --> 返回频率最高的 K 元素 注意点: 题目要求时间复杂度优于 O(n log n) 首先频率统计最优雅的方法应该是借助哈希映射...重点是返回 K 频率最高的元素, 所以另一种更简单的方法是直接借助 堆(优先队列) 这种数据结构 维护一 大小为 K 的堆来动态存储 K 频率最高的元素, 其时间复杂度为 O(n) 代码:...heapq 堆数据结构, 有两函数: nlargest nsmallest 例如 heapq.nsmallest(n, nums) 表示取迭代器 nums n 最大元素, 该函数还能接受一

75820

动画: 快速排序 | 如何求第 K元素

别着急,还有一需求就是公司每个月都会进行抽奖福利,抽奖的方式是,老板随机抽取贡献值为第 K 大的贡献值的员工送出福利一份,共选取 n 位,而不是评功论赏了,如果让你实现一系统,你该如何实现呢?...因为我们不断的将大区间分成小区间,然后一直分下去,不对,一直分总有一尽头的,所以这也是递归的终止条件。当满足这个条件时,就不再继续往下进行递归,那么快速排序的递归条件是什么呢?...最关键的是快速排序中有一分区函数 partition,分区函数的作用就是随机找到一区分点 pivot,然后对数据进行分区,该函数会返回分区后 pivot 的下标。 我们好奇的是如何进行分区的?...还有一种极端的情况就是,如果原数据是一组有序数据,如果每次都要选择最后一元素为区分点,大约需要进行 n 次操作,每次遍历 n/2 元素,所以时间复杂度就会推化成 O(n²)。...如果等于 K ,那么数组中下标为 p 的元素就是第 K 大数据。 ? 如上图的 5 就是第四大数据,但是它在数组中的下标为 3,所以需要加 1。

47820

【力扣-优先队列】 K 高频元素

题目描述 K 高频元素 中等 给你一整数数组 nums 和一整数 k ,请你返回其中出现频率 k 高的元素。你可以按 任意顺序 返回答案。...5 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中 k 高频元素的集合是唯一的 进阶: 你所设计算法的时间复杂度 必须...然后你可以直接按照出现次序排序,但是这样排序最快要O(nlogn),可以进一步优化,用优先队列来做: 先开一小根堆,让上面计算出的元素和频次依次入队。...如果队列中元素数量小于k,新元素直接入队,如果已有k,则让队头元素频次(队中最小)和新元素的出现频次比较,如果新元素的出现频次小于队头元素频次,说明队列中k元素频次均大于当前新元素,所以舍弃该新元素...反之如果新元素频次大于队头元素频次,则队头出队,新元素插入。最终队列中的k元素就是出现频次最高的k元素了。

29510
领券