使用堆在下面的算法工作:红宝石算法
鉴于整数的非空数组,返回k个最频繁的 元素。
例如,给定[1,1,1,2,2,3]和k = 2,返回[1,2]。
注意:您可以假定k总是有效的,1≤k≤独特的 元素的数量。算法的时间复杂度必须优于O(n log n),其中n是数组的大小。
我最初的冲动是使用散列表作为关键字的数字和作为出现次数的值。然后,我可以将每个键值对作为一个节点插入到maxHeap中,并简单地删除max直到k == 0.
构建节点并将输入到maxHeap中的方法解决方法是? 注意:我对一个更优化的解决方案并不好奇 - 对于我是否实现了使用maxHeap重复查找具有最大出现次数的数字的想法感到好奇。节点部分似乎过度杀伤,但我不知道该怎么做。
这听起来对我来说就像是正确的做法。基本上你的问题归结为“在数组中找到k个最大的元素”,通常通过快速选择(但是这是O(n^2)最坏的情况)或通过使用堆来解决。 – avysk