思路一:暴力法
遍历list,利用dict计数,根据计数再排序,最后返回前k个
代码
class Solution(object):
def topKFrequent(self, nums, k):
d = {}
if not nums or k <= 0:
return []
for i in range(len(nums)):
d[nums[i]] = d.get(nums[i],0) + 1
d = sorted(d.items(),key=lambda d:d[1],reverse=True)
res = []
for j in range(k):
res.append(d[j][0])
return res
注意dict排序后是一个list:(参考链接)
思路二:堆
计数之后建立大根堆,每次弹出堆顶元素
可以用heapq中nlargest函数,直接进行操作
class Solution(object):
def topKFrequent(self, nums, k):
from collections import Counter
import heapq
count = Counter(nums)
return heapq.nlargest(k,count.keys(),key=count.get)
也可以利用小顶堆比较频率,维护大小为k。
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
d = {}
for i in nums:
d[i] = d.get(i, 0) + 1
# 建立小根堆
q = []
for key, value in d.items():
# 先建立k大的小根堆
if len(q) < k:
heapq.heappush(q, (value, key))
else:
# 小根堆的堆顶大于当前元素,说明至少有k个元素大于当前元素大
# 说明当前元素肯定不是topk,跳过
if value > q[0][0]:
heapq.heappop(q)
heapq.heappush(q, (value, key))
res = []
for pair in q:
res.append(pair[1])
return res
还可以用手动实现一个堆,进行操作。Python手写堆参考