要求
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
核心代码
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
from collections import Counter
return [digit for digit,freq in Counter(nums).most_common(k)]
另一解法(重点)
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
from collections import Counter
from heapq import heapify,heappush,heappop
dic = Counter(nums)
heap = []
heapify(heap)
for key,val in dic.items():
heappush(heap,(-val,key))
res = []
while k:
top = heappop(heap)
res.append(top[1])
k -= 1
return res
第三种解法
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
from collections import Counter
from heapq import heapify,heappush,heappop
dic = Counter(nums)
heap = []
heapify(heap)
for key,val in dic.items():
if len(heap) <k:
heappush(heap,(val,key))
else:
if heap[0][0] < val:
heappush(heap,(val,key))
heappop(heap)
res = []
while heap:
top = heappop(heap)
res.append(top[1])
return res
重点题目
解题思路:
第一种解法:通过调库的方式Counter的most_common方法,参数k,统计出来频率最高的k个元素,返回输出。第二种解法(重点):题目问前K个高频,就是求前k个出现次数最大的元素。经典的TOP k问题一般都是用堆,此题同理。先统计一下每个元素出现的频率,然后把这些频率建最大堆,保证堆顶元素出现频率最大,然后pop k次 堆顶,即可找到前k个出现次数最大的元素。第三种解法(重点):其实第三种解法是在第二种解法的基础上进行的优化,我们要选取的是前k个元素,所以我们不需要将所有元素都进行堆的构建,当我们的堆的数量小于k,直接添加元素,当我们的堆的数量超过k,我们需要判断元素是不是要加入到堆中,因为构建的是最小堆,所以元素只有大于堆顶元素才能将其加入到堆中,并且将顶元素弹出,维持堆中一共k个元素,构建完成,最后遍历将堆中所有元素输出即可。