📅  最后修改于: 2023-12-03 15:10:20.102000             🧑  作者: Mango
堆(Heap)是一种树形数据结构,分为最大堆和最小堆。最大堆的根节点最大,最小堆的根节点最小。堆常用于实现优先队列、堆排序等算法。堆的核心操作是插入与删除根节点。插入操作将新元素插入到堆的末尾,然后与其父节点比较并上浮或下沉至正确位置。删除根节点操作将根节点删除,并将堆的末尾元素移至根节点,并与其子节点比较并下沉或上浮至正确位置。堆也可以用数组实现。
问题12是LeetCode上的一道题目,题目描述如下:
给定一个非空整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
解释: 出现频率前两个元素是[1,2],它们的出现次数都是 2。
示例 2:
输入: nums = [1], k = 1 输出: [1]
解释: 出现频率前一个元素是[1],它的出现次数为 1。
算法实现需要用到堆的数据结构。
为了解决问题12,需要用到一个字典来记录每个数字出现的频率。然后将每个数字及其频率存入堆中,并将堆中的前k个数取出来即可。由于Python自带的heapq模块只提供了最小堆的操作,因此需要将数字的频率取相反数,这样堆中最小元素即为频率最大的元素。
代码如下:
import heapq
def topKFrequent(nums: List[int], k: int) -> List[int]:
# 用字典记录每个数字出现的频率
freq = {}
for num in nums:
freq[num] = freq.get(num, 0) + 1
# 将数字及其频率存入堆中
heap = []
for num, count in freq.items():
heapq.heappush(heap, (-count, num))
# 取出前k个数
ans = []
for _ in range(k):
ans.append(heapq.heappop(heap)[1])
return ans
以上代码使用了Python自带的heapq模块,该模块提供了堆的操作。其中heappush(elem)用于将元素elem插入堆中,heappop()用于去除并返回堆中的最小元素。由于堆中存储的是(-count, num)这样的元组,heappop()会返回最小的(-count, num)元组,因此需要取其第二个元素num返回。