问题描述:
给定一个n
个数的数组(n <= 10,000,000)
,以及一个数字k
,请输出:数组中出现最频繁的k
个数。
例如:数组[2,3,1,5,2,1,2,4,3,2,3], k=3
出现最频繁的数分别是2
和3
(2
出现4
次,3
出现3
次),其次是1
(出
现2
次) 所以输出1,2,3
这3
个数即可,输出顺序随意。
问题分析:
方法基本有两个:
(1)用hash
统计出现次数,然后根据次数进行排序,输出结果即可。
(2)用hash
统计出现次数,然后使用堆处理,输出结果即可。
Python3实现:
方法一: 使用排序
# @Time :2019/01/31
# @Author :LiuYinxing
# hash 数组 排序
from collections import defaultdict
class Solution:
def findFrequentlyK(self, A, k):
counts = defaultdict(int) # 所有值被初始化为0
for x in A: # 计数统计
counts[x] += 1
if len(counts) <= k:
return list(counts.keys())
res = sorted(counts.items(), key=lambda x:x[1], reverse=True) # 排序输出
return [x[0] for x in res[:k]]
if __name__ == '__main__':
solu = Solution()
A, k = [2, 3, 1, 5, 2, 1, 2, 4, 3, 2, 3], 10
A, k = [2, 3, 1, 5, 2, 1, 2, 4, 3, 2, 3], 3
print(solu.findFrequentlyK(A, k))
方法二:使用堆(省事,使用Python自带)
# @Time :2019/01/31
# @Author :LiuYinxing
# hash 数组 堆
from collections import defaultdict
import heapq
class Solution:
def findFrequentlyK(self, A, k):
counts = defaultdict(int) # 所有值被初始化为0
for x in A: # 计数统计
counts[x] += 1
if len(counts) <= k:
return list(counts.keys())
res = heapq.nlargest(k, counts.items(), key=lambda x: x[1]) # 从堆中找出最大的K个数
return [x[0] for x in res]
if __name__ == '__main__':
solu = Solution()
A, k = [2, 3, 1, 5, 2, 1, 2, 4, 3, 2, 3], 10
A, k = [2, 3, 1, 5, 2, 1, 2, 4, 3, 2, 3], 3
print(solu.findFrequentlyK(A, k))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。
题目链接: 2019/01/31 在线笔试题