返回

LeetCode 算法学习 -- Heap -- 最小的 k 个数

前端

LeetCode 算法学习 -- Heap -- 最小的 k 个数

引言

在数据结构和算法领域,堆是一种二叉树,通常用于存储优先级队列。在最小堆中,根节点总是包含最小元素,其子节点的值大于或等于其父节点的值。使用堆可以高效地查找和检索最小的元素,因此它在许多应用程序中都有广泛的应用。

在这篇文章中,我们将探讨 LeetCode 上一道与堆相关的简单难度题目 —— 剑指 Offer 40. 最小的 k 个数。我们将深入了解问题的陈述、解决方案和实现细节,同时提供清晰的代码示例和解释。

问题陈述

给定一个整数数组 nums 和一个整数 k,要求返回 nums 中最小的 k 个数。

解决方案

要解决这个问题,我们可以使用最小堆来存储最小的 k 个数。具体步骤如下:

  1. 初始化一个最小堆 min_heap
  2. 遍历 nums 数组中的每个元素 num
    • num 插入 min_heap
    • 如果 min_heap 中元素数量大于 k,则弹出堆顶元素。
  3. 返回 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 个数。通过清晰的解释和代码示例,我们展示了如何实现该解决方案。通过理解该算法的原理,我们可以解决更多与堆相关的算法问题。