
4种解法 - 最小的k个数
排序后截取:这种方法简单直接,对整个数组排序后直接取前k个元素。时间复杂度为O(N log N),空间复杂度为O(N)。 大顶堆:维护一个大小为k的大顶堆,保证堆顶是当前最大的元素,每次遇到更小的元素替换堆顶。时间复杂度为O(N log N),空间复杂度为O(k)。 对输入数组进行排序。 截取前k个元素作为结果。 初始化一个大小为k的堆,将前k个元素加入堆。 遍历数组剩余的元素,对比当前堆顶元素,替换更小的元素。 最终取出堆中的元素,恢复为正数。
发布日期:2021-05-08 16:54:48
浏览次数:24
分类:精选文章
本文共 1096 字,大约阅读时间需要 3 分钟。
问题分析
我们需要从一个整数数组中找出最小的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个最小的元素。通过将元素取负数来模拟大顶堆的行为。
步骤:
代码示例:
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值。根据实际情况选择最优方法,以达到最佳性能。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月27日 19时20分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux 最常用命令(简单易学,但能解决 95% 以上的问题)
2023-02-01
Linux 服务器上安装和使用 Redis,只需这 4 步!
2023-02-01
Linux 服务器启动流程详解
2023-02-01
linux 服务器性能监控(一)
2023-02-01
Linux 权限管理基本命令
2023-02-01
Linux 查找搜索命令
2023-02-01
linux 查看 mongodb 连接数
2023-02-01
Linux 查看目录大小
2023-02-01
linux 根目录扩容
2023-02-01
linux 添加本地yum源
2023-02-01
linux 源码搭建lnmp_Linux源码安装lnmp
2023-02-01
Linux 环境下将 ASM 磁盘映射到物理磁盘的完整指南
2023-02-01
Linux 的 cat 命令居然有那么多门道,涨知识了!
2023-02-01
Linux 的NFS服务的配置
2023-02-01
linux 的vi vim 的常用的基本命令
2023-02-01
Linux 的性能调优的思路
2023-02-01
Linux 的文本搜索命令 grep
2023-02-01
Linux 的账号与群组管理
2023-02-01
linux 目录&基础命令
2023-02-01