最小的 k 个数

发布于 2023-07-16 19:09:27 字数 1290 浏览 35 评论 0

最小的 k 个数是指在一个无序数组中找出最小的 k 个数。

一种简单的方法是对数组进行排序,然后取出前 k 个数即可,时间复杂度为 O(nlogn)。

另一种更高效的方法是使用堆。可以使用一个大小为 k 的最大堆来存储当前找到的最小的 k 个数。首先将数组的前 k 个数放入堆中,然后依次遍历剩下的数,如果当前数比堆顶的数小,就将其与堆顶的数交换,并重新调整堆,确保堆内的数仍然是最小的 k 个数。遍历完成后,堆中的数即为最小的 k 个数。

下面是使用堆实现最小的 k 个数的代码:

def getLeastNumbers(arr, k):
    if not arr or k <= 0 or k > len(arr):
        return []

    # 构建最大堆
    def buildHeap(arr, k):
        for i in range(k//2-1, -1, -1):
            heapify(arr, i, k)

    # 调整堆
    def heapify(arr, i, k):
        left = 2 * i + 1
        right = 2 * i + 2
        largest = i
        if left < k and arr[left] > arr[largest]:
            largest = left
        if right < k and arr[right] > arr[largest]:
            largest = right
        if largest != i:
            arr[largest], arr[i] = arr[i], arr[largest]
            heapify(arr, largest, k)

    # 构建最大堆
    buildHeap(arr, k)

    # 调整堆
    for i in range(k, len(arr)):
        if arr[i] < arr[0]:
            arr[0], arr[i] = arr[i], arr[0]
            heapify(arr, 0, k)

    return arr[:k]

该方法的时间复杂度为 O(nlogk),空间复杂度为 O(k)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

乙白

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文