📜  数据结构|堆|问题12(1)

📅  最后修改于: 2023-12-03 15:10:20.102000             🧑  作者: Mango

堆的介绍与问题12解决方案

什么是堆?

堆(Heap)是一种树形数据结构,分为最大堆和最小堆。最大堆的根节点最大,最小堆的根节点最小。堆常用于实现优先队列、堆排序等算法。堆的核心操作是插入与删除根节点。插入操作将新元素插入到堆的末尾,然后与其父节点比较并上浮或下沉至正确位置。删除根节点操作将根节点删除,并将堆的末尾元素移至根节点,并与其子节点比较并下沉或上浮至正确位置。堆也可以用数组实现。

问题12

问题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返回。