class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
dp = collections.defaultdict(int)
for i in nums:
dp[i]+=1
dp = sorted(dp.items(), key=lambda item:item[1], reverse=True)
temp = []
i=0
return [dp[j][0] for j in range(k)]
补充一个使用最小堆的方法:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
if len(nums)==k:
return nums
# 利用堆结构
num_dic = dict(Counter(nums))
import heapq
h = []
for key, value in num_dic.items():
heapq.heappush(h, (value, key)) # 按第一个键值进行排序,堆顶是最小值
if len(h) > k:
heapq.heappop(h) # 如果长度超出k,则弹出堆中最小的值
return [item[1] for item in h]
#利用Counter计数器
return [i[0] for i in Counter(nums).most_common(k)]
#利用字典进行排序
dic = defaultdict(int)
for num in nums:
dic[num]+=1
dic_sort = sorted(dic.items(),key = lambda x:x[1],reverse=True)
print(dic_sort)
res = []
for i in range(len(dic_sort)):
if i==k:
break
else:
res.append(dic_sort[i][0])
return res
先对每个元素出现的频率进行计数,然后按键值进行建堆,堆顶是最小值。然后从堆顶进去取元素操作,直到最小堆中只含有k个元素,然后遍历堆就得到频率前k高的元素了。
总结:比较简单,直接用hash表,然后进行排序即可。 一般求解前k个元素或或者前k大元素都可以使用最小堆去解决这个问题。