牛客66道编程题——最小的K个数

题目

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

方法一:利用python的sort函数和切片的性质

class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if tinput==[]:
            return []
        if k>len(tinput):
            return []
        tinput.sort()
        return tinput[:k]

方法二:利用最大堆和最小堆

class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code herem
      
        #创建最大堆
        def createMaxHeap(num):
            maxHeap.append(num)
            currentIndex=len(maxHeap)-1
            while currentIndex!=0:
                parentIndex=(currentIndex-1)>>1#相当于parentIndex=(currentIndex-1)//2,目的是为了寻找父结点
                if maxHeap[parentIndex]<maxHeap[currentIndex]:#和父结点进行比较
                    maxHeap[parentIndex],maxHeap[currentIndex]=maxHeap[currentIndex],maxHeap[parentIndex]
                else:
                    break
                
        #当根结点变化时,如何调整最大堆
        def adjustMaxHeap(num):
            if num<maxHeap[0]:
                maxHeap[0]=num
            maxHeapLen=len(maxHeap)
            index=0
            while index<maxHeapLen:
                leftIndex=index*2+1
                rightIndex=index*2+2
                largerIndex=0
                if rightIndex<maxHeapLen:
                    if maxHeap[rightIndex]<maxHeap[leftIndex]:
                        largerIndex=leftIndex
                    else:
                        largerIndex=rightIndex
                elif leftIndex<maxHeapLen:
                    largerIndex=leftIndex
                else:
                    break
                if maxHeap[index]<maxHeap[largerIndex]:
                    maxHeap[index],maxHeap[largerIndex]=maxHeap[largerIndex],maxHeap[index]
                index=largerIndex
        
        maxHeap=[]
        inputLen=len(tinput)
        if inputLen<k or k<=0:
            return []
        for i in range(inputLen):
            if i<k:
                createMaxHeap(tinput[i])
            else:
                adjustMaxHeap(tinput[i])
        maxHeap.sort()
        return maxHeap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值