数据结构与算法之 leetcode 数组前 K 个高频元素算法 堆结构

数据结构与算法阿木 发布于 4 天前 4 次阅读


数组前 K 个高频元素算法(堆结构)解析与实现

在数据结构与算法领域,数组是一种非常基础且常用的数据结构。而高频元素问题则是数组处理中一个常见的问题。在LeetCode等编程竞赛平台中,数组前 K 个高频元素问题是一个经典的题目。本文将围绕这一主题,深入解析其算法原理,并使用堆结构进行实现。

问题分析

给定一个整数数组 `nums` 和一个整数 `k`,返回数组中前 `k` 个高频元素的列表。其中,高频元素是指在数组中出现次数超过 `k` / `n` 的元素,`n` 是数组的大小。

算法原理

为了解决这个问题,我们可以采用以下步骤:

1. 统计数组中每个元素的出现次数。

2. 使用一个数据结构来存储这些元素及其出现次数,并按照出现次数进行排序。

3. 从排序后的数据结构中取出前 `k` 个元素。

在实现过程中,我们可以使用哈希表来统计元素的出现次数,然后使用一个最小堆(或最大堆)来维护出现次数最多的 `k` 个元素。

使用堆结构实现

堆结构简介

堆是一种特殊的完全二叉树,它满足以下性质:

- 最大堆:每个父节点的值都大于或等于其子节点的值。

- 最小堆:每个父节点的值都小于或等于其子节点的值。

在Python中,我们可以使用`heapq`模块来实现堆结构。

实现代码

python

import heapq

def topKFrequent(nums, k):


统计元素出现次数


count = {}


for num in nums:


count[num] = count.get(num, 0) + 1

使用最小堆存储出现次数最多的 k 个元素


heap = []


for num, freq in count.items():


heapq.heappush(heap, (freq, num))


if len(heap) > k:


heapq.heappop(heap)

从堆中取出前 k 个元素


result = []


while heap:


result.append(heapq.heappop(heap)[1])


return result[::-1] 反转结果,因为最小堆中元素是按照出现次数降序排列的

测试代码


nums = [1,1,1,2,2,3]


k = 2


print(topKFrequent(nums, k)) 输出: [1,2]


代码解析

1. 我们使用一个字典`count`来统计数组中每个元素的出现次数。

2. 然后,我们使用`heapq`模块中的`heappush`函数将每个元素及其出现次数作为一个元组`(freq, num)`推入最小堆`heap`中。

3. 如果堆的大小超过了`k`,我们使用`heapq.heappop`函数移除堆顶元素,即出现次数最少的元素。

4. 我们从堆中取出前`k`个元素,并反转结果列表,因为最小堆中元素是按照出现次数降序排列的。

总结

本文深入解析了数组前 K 个高频元素算法,并使用堆结构进行了实现。通过使用最小堆,我们可以高效地维护出现次数最多的 `k` 个元素,从而在时间复杂度为 `O(n log k)` 内解决问题。在实际应用中,我们可以根据具体需求选择不同的数据结构和算法来优化性能。