题目描述:
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
解法一:
使用字典的键储存nums,值储存nums出现的次数,构成键值对,再将字典的键值翻转,对键进行排列(也就是翻转前的值即每个nums出现的次数)。再取出键最高的k个值对应的value即可。(有点疑惑的是每个数都出现一次,键值翻转过后有很多键是相同的,如何找到对应的值)
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
# 使用字典统计数字出现次数
time_dict = defaultdict(int)
for num in nums:
time_dict[num] += 1
# 更改字典,key为出现次数,value为相应的数字的集合
index_dict = defaultdict(list)
for key in time_dict:
index_dict[time_dict[key]].append(key)
# 排序
key = list(index_dict.keys())
key.sort()
result = []
cnt = 0
# 获取前k项
while key and cnt != k:
result += index_dict[key[-1]]
cnt += len(index_dict[key[-1]])
key.pop()
return result[0: k]
解法二:基于堆的快速排序方法。将nums一次加入规模为k的大顶堆中,最后将k个元素出堆。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
map = {}
for i in nums:
if i in map:
map[i] +=1
else:
map[i] = 1
heap = []
for key, value in map.items():
heapq.heappush(heap,(value,key))
if len(heap)>k:
heapq.heappop(heap)
result = []
for i in range(k):
result.append(heapq.heappop(heap)[1])
return result