【python】最小的k个数

class Solution:
    def GetLeastNumbers_Solution(self, t, k):
        # write code here
        if len(t) == 0 or len(t) < k or k <=0:
            #不设置k == 0 返回,k为0时会陷入无限循环
            return []
        s = 0
        l = len(t) - 1
        index = self.partition(t, s, l)
        print('index1', index)
        while index != (k - 1) :
            if index > k - 1:
                l = index - 1
                #必须写为l = index - 1, s = index + 1
                #否则s与partition返回的index相等时,会陷入无限循环
            elif index < k - 1:
                s = index + 1

            index = self.partition(t, s, l)
            print('index2',index)

        return t[:k]

    def partition(self, t, s, l):
        p = t[s]
        print('s,l',s,l)
        print(t)
        t[l], t[s] = t[s], t[l]
        print(t)
        small = s - 1
        large = s
        while large < l:
            if t[large] < p:
                small += 1
                if large != small:
                    t[small], t[large] = t[large], t[small]
            large += 1

            # while t[large] >= p and large < l:
            #     large += 1
            # if large != small:
            #     print(small, large)
            #     t[small], t[large] = t[large], t[small]
            #     small += 1
            #
            #     print('hi:',t)
            # large += 1
        small += 1
        t[small], t[l] = t[l], t[small]
        #
        print(t)
        print(small)
        return small

注意以上陷入无限循环的点。

求解最小的k个数,两种方法:1)先排序,在取前k个,快排最佳 ,以上便是  2)最小堆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值