返回
LeetCode 算法学习 -- Heap -- 最小的 k 个数
前端
2024-01-25 19:06:50
LeetCode 算法学习 -- Heap -- 最小的 k 个数
引言
在数据结构和算法领域,堆是一种二叉树,通常用于存储优先级队列。在最小堆中,根节点总是包含最小元素,其子节点的值大于或等于其父节点的值。使用堆可以高效地查找和检索最小的元素,因此它在许多应用程序中都有广泛的应用。
在这篇文章中,我们将探讨 LeetCode 上一道与堆相关的简单难度题目 —— 剑指 Offer 40. 最小的 k 个数。我们将深入了解问题的陈述、解决方案和实现细节,同时提供清晰的代码示例和解释。
问题陈述
给定一个整数数组 nums
和一个整数 k
,要求返回 nums
中最小的 k
个数。
解决方案
要解决这个问题,我们可以使用最小堆来存储最小的 k
个数。具体步骤如下:
- 初始化一个最小堆
min_heap
。 - 遍历
nums
数组中的每个元素num
:- 将
num
插入min_heap
。 - 如果
min_heap
中元素数量大于k
,则弹出堆顶元素。
- 将
- 返回
min_heap
中的所有元素。
代码示例
import heapq
def smallest_k(nums, k):
min_heap = []
for num in nums:
heapq.heappush(min_heap, num)
if len(min_heap) > k:
heapq.heappop(min_heap)
return min_heap
复杂度分析
- 时间复杂度:O(n log k),其中 n 是数组
nums
的长度。 - 空间复杂度:O(k),用于存储最小堆。
示例用例
nums = [3, 2, 1, 5, 6, 4]
k = 2
result = smallest_k(nums, k)
print(result) # 输出: [1, 2]
结论
在这篇文章中,我们讨论了解决 LeetCode 题目 剑指 Offer 40. 最小的 k 个数 的方法。我们使用最小堆来高效地找到和检索最小的 k
个数。通过清晰的解释和代码示例,我们展示了如何实现该解决方案。通过理解该算法的原理,我们可以解决更多与堆相关的算法问题。