题目:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
例如输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
题解:
思路还是比较清晰的
1,先初始化一个map,通过遍历,将每个元素的次数统计出来
2,取次数中的前k个元素。
关键是第二步怎么取。如果通过排序来取的话,时间复杂度肯定是相对高一些。
官网解法是通过大顶堆来取值。堆的算法可以自己写,也可以用python自带的heapq模块。
另外吧,我觉得也可以直接取。先取最大的,然后将其从map中pop出来。然后取下一个,直到取够K个。
时间复杂度为 n + n-1 + n-2 +…n-k
code
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
dic = {}
for i in nums:
if i in dic.keys():
dic[i]+=1
else:
dic[i]=1
keys = dic.keys()
res = []
while k>0:
temp = [0,-float('inf')]
for i in keys:
if temp[1] < dic[i]:
temp[0] = i
temp[1] = dic[i]
dic.pop(temp[0])
res.append(temp[0])
k-=1
return res