4种解法 - 最小的k个数
发布日期:2021-05-08 16:54:48 浏览次数:24 分类:精选文章

本文共 1096 字,大约阅读时间需要 3 分钟。

问题分析

我们需要从一个整数数组中找出最小的k个数。这个问题看起来简单,但要实现高效的解决方案,需要仔细考虑不同的方法及其优劣。

方法选择

经过分析,选择了两种方法来解决这个问题:

  • 排序后截取:这种方法简单直接,对整个数组排序后直接取前k个元素。时间复杂度为O(N log N),空间复杂度为O(N)。
  • 大顶堆:维护一个大小为k的大顶堆,保证堆顶是当前最大的元素,每次遇到更小的元素替换堆顶。时间复杂度为O(N log N),空间复杂度为O(k)。
  • 解决方案

    方法一:排序后截取

    思路:首先对数组进行排序,然后直接取前k个元素作为结果。

    步骤

  • 对输入数组进行排序。
  • 截取前k个元素作为结果。
  • 代码示例

    def getLeastNumbers(arr: List[int], k: int) -> List[int]:    if k <= 0:        return []    if k >= len(arr):        return arr    rst = sorted(arr)    return rst[:k]

    优势:时间复杂度为O(N log N),实现简单,适合大多数情况。

    方法二:使用大顶堆

    思路:使用大顶堆来维护k个最小的元素。通过将元素取负数来模拟大顶堆的行为。

    步骤

  • 初始化一个大小为k的堆,将前k个元素加入堆。
  • 遍历数组剩余的元素,对比当前堆顶元素,替换更小的元素。
  • 最终取出堆中的元素,恢复为正数。
  • 代码示例

    import heapqdef getLeastNumbers(arr: List[int], k: int) -> List[int]:    if k <= 0:        return []    if k >= len(arr):        return arr    rst = []    for i in range(k):        rst.append(-arr[i])    heapq.heapify(rst)    for num in arr[k:]:        if -rst[0] > num:            heapq.heapreplace(rst, -num)    return [-x for x in rst]

    优势:时间复杂度为O(N log k),适合较大的k值,空间复杂度为O(k)。

    总结

    选择哪种方法取决于具体需求和性能优化。排序后截取简单易用,适合大多数情况;而大顶堆方法在空间和时间上更优,适合处理较大的k值。根据实际情况选择最优方法,以达到最佳性能。

    上一篇:面向对象开发 SOLID 设计原则(C#举例)
    下一篇:3种解法 - 计算最长回文串

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月27日 19时20分46秒