剑指offer-29.最小的K个数-Python

29.最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

记录

考点:时间效率
如果对排序有兴趣,可以看讨论中的热评牛客

方法一:
sorted

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if len(tinput) < k or k == 0:
            return []
        tmp = sorted(tinput)
        return tmp[:k]

方法二:
堆排序,复杂度O(nlogk)。

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        #常规判断
        if k > len(tinput) or k == 0:
            return []
        n = len(tinput)
        a = tinput[:k]
        # 前k个数建立大顶堆
        #非叶子节点
        for i in range(k//2-1, -1, -1):
            self.initiate(i, a, k)
        # 对剩下的n-k个数进行判断
        for i in range(k, n):
            if tinput[i] < a[0]:
                a[0] = tinput[i]
                self.initiate(0, a, k)
        
        for i in range(len(a)-1, -1, -1):
            a[i], a[0] = a[0], a[i]
            self.initiate(0, a, i)
        return a

    def initiate(self, index, a, length):
    	#非叶子节点
        temp = a[index]
        #该节点的左节点
        j = index*2+1
        while j < length:
        	#左右比较
            if j+1 < length and a[j+1] > a[j]:
            	#指向右
                j += 1
            #和该节点的根节点比较
            if a[j] > temp:
            	#比根节点大,替换根节点
                a[index] = a[j]
                index = j
            else:
                break
            #到下一层
            j = j*2+1
        a[index] = temp

还是不是非常理解,附上链接:最小的K个数堆排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值