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

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


数组前 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 个元素。在实际应用中,堆排序算法在处理大量数据时具有较好的性能,是解决类似问题的有效方法。