【剑指 Offer】剑指 Offer 40. 最小的k个数

本文对比四种Python方法解决获取列表中最小k个数问题:冒泡排序、堆排序、快速排序和优化版快速排序。展示了它们的执行时间、内存消耗,并指出最高效解决方案。

题目
代码
执行用时:
56 ms, 在所有 Python3 提交中击败了73.20%的用户
内存消耗:
15.8 MB, 在所有 Python3 提交中击败了95.39%的用户
通过测试用例:
38 / 38

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        arr.sort()
        return arr[:k]

【方法2】
执行用时:
64 ms, 在所有 Python3 提交中击败了61.82%的用户
内存消耗:
内存消耗:
15.9 MB, 在所有 Python3 提交中击败了85.22%的用户
通过测试用例:
38 / 38

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        heapify(arr)        
        ans=[]
        while k:
            k-=1
            ans.append(heappop(arr))
        return ans

【方法3】快速排序原始版本
执行用时:
272 ms, 在所有 Python3 提交中击败了12.45%的用户
内存消耗:
19.1 MB, 在所有 Python3 提交中击败了8.83%的用户
通过测试用例:
38 / 38

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        def quick_sort(l,r):
            if l>r:return
            i,j=l,r
            while i<j:
                while i<j and arr[j]>arr[l]:j-=1
                while i<j and arr[i]<=arr[l]:i+=1
                arr[i],arr[j]=arr[j],arr[i]
            arr[i],arr[l]=arr[l],arr[i]
            quick_sort(l,i-1)
            quick_sort(i+1,r)
        quick_sort(0,len(arr)-1)
        return arr[:k]

【方法4】
执行用时:
112 ms, 在所有 Python3 提交中击败了37.88%的用户
内存消耗:
19 MB, 在所有 Python3 提交中击败了10.88%的用户
通过测试用例:
38 / 38

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        def quick_sort(l,r):
            if l>=r:return
            i,j=l,r
            while i<j:
                while i<j and arr[j]>=arr[l]:j-=1
                while i<j and arr[i]<=arr[l]:i+=1
                arr[i],arr[j]=arr[j],arr[i]
            arr[i],arr[l]=arr[l],arr[i]
            if i>k:quick_sort(l,i-1)
            if i<k:quick_sort(i+1,r)
        quick_sort(0,len(arr)-1)
        return arr[:k]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值