数组前 K 个高频元素(堆排序实现)
在数据结构与算法领域,LeetCode 是一个广受欢迎的在线编程平台,它提供了大量的编程题目,旨在帮助开发者提升算法能力。其中,“数组前 K 个高频元素”是一道经典的题目,要求我们找出数组中出现频率最高的前 K 个元素。本文将围绕这一主题,使用堆排序算法来实现解决方案,并深入探讨相关技术细节。
1. 题目描述
给定一个整数数组 `nums` 和一个整数 `k`,返回数组中出现频率最高的前 `k` 个元素。
示例:
输入:nums = [1,1,1,2,2,3], k = 2
输出:[1,2]
2. 解决方案
为了解决这个问题,我们可以采用以下步骤:
1. 统计数组中每个元素的出现频率。
2. 使用一个最小堆(优先队列)来维护出现频率最高的前 K 个元素。
3. 遍历统计结果,如果堆的大小小于 K,则将当前元素加入堆中;如果堆的大小等于 K,则比较当前元素与堆顶元素(最小元素)的频率,如果当前元素的频率更高,则将堆顶元素弹出,将当前元素加入堆中。
4. 堆中的元素即为出现频率最高的前 K 个元素。
3. 代码实现
下面是使用 Python 实现的代码:
python
import heapq
def topKFrequent(nums, k):
统计元素频率
frequency = {}
for num in nums:
frequency[num] = frequency.get(num, 0) + 1
使用最小堆维护前 K 个高频元素
min_heap = []
for num, freq in frequency.items():
heapq.heappush(min_heap, (freq, num))
if len(min_heap) > k:
heapq.heappop(min_heap)
返回结果
return [num for freq, num in sorted(min_heap, reverse=True)]
测试代码
nums = [1,1,1,2,2,3]
k = 2
print(topKFrequent(nums, k)) 输出:[1,2]
4. 技术细节
4.1 堆排序
堆排序是一种基于比较的排序算法,它使用堆这种数据结构来进行排序。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。
在 Python 中,`heapq` 模块提供了堆操作的相关函数,如 `heappush`(将元素加入堆中)和 `heappop`(从堆中弹出最小元素)。
4.2 频率统计
为了找出出现频率最高的前 K 个元素,我们需要统计数组中每个元素的出现频率。在 Python 中,可以使用字典来实现这一功能。
4.3 排序
我们需要将堆中的元素按照频率从高到低进行排序,以便返回结果。在 Python 中,可以使用 `sorted` 函数进行排序。
5. 总结
本文介绍了如何使用堆排序算法解决 LeetCode 中的“数组前 K 个高频元素”问题。通过统计元素频率、使用最小堆维护前 K 个高频元素以及排序,我们能够高效地找到出现频率最高的前 K 个元素。在实际应用中,堆排序算法在处理大量数据时具有较好的性能,是解决类似问题的有效方法。
Comments NOTHING