【刷题】最小的k个数 python

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
如输入:[4,5,1,6,2,7,3,8],4
输出则为:[1,2,3,4]
思路:排序,可以采用构建最小堆,重复k次,即找到了最小的个数,时间复杂度为 k ∗ l o g n k*logn klogn

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.input = []
    # 最小堆
    def min_heap(self, input, n, i):
        min_idx = i
        l = i*2+1
        r = i*2+2
        
        if l < n and input[i] > input[l]:
            min_idx = l
        if r < n and input[min_idx] > input[r]:
            min_idx = r
        if min_idx != i:
            input[i], input[min_idx] = input[min_idx], input[i]
            self.min_heap(input, n, min_idx)
            
        
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        result = []
        # 边界条件
        if len(tinput) < k or k <= 0:
            return result
        self.input = tinput
        for j in range(k):
            for i in range(len(self.input)-1, -1, -1):
                self.min_heap(self.input, len(self.input), i)
            print(self.input)    
            result.append(self.input[0])
            self.input = self.input[1:]
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值