AcWing 53. 最小的k个数

题目链接

题目挺简单的,我直接用了python自己带的排序功能

class Solution(object):
    def getLeastNumbers_Solution(self, input, k):
        """
        :type input: list[int]
        :type k: int
        :rtype: list[int]
        """
        #创建list保存最小值
        min_list=[]
        for i in range(k):
            min_list.append(input[i])
        #通过python自带函数排序
        min_list.sort()
        for i in range(k,len(input)):  #从k+1个数到最后一一进行对比
            for j in range(k,0,-1):
                if input[i]<min_list[j-1]:
                    min_list[j-1]=input[i]
                    min_list.sort()
                    break
        return min_list

当然虽然我是这样做的,但它实际上考察的是排序算法,可以写一下堆排序,快速排序,二叉排序树

堆排序
就这样吧,写的挺累的,把入堆和出堆的操作写了

class Dui():
    def __init__(self):
        #初始化一个列表
        self.dui=[0]
    def rudui(self,item):
        #分为  为空和不为空
        self.dui.append(item)
        i=len(self.dui)-1
        if i==1:
            pass
        while i>0:
            if item<self.dui[i//2]:
                #需要换位置
                self.dui[i], self.dui[i//2]= self.dui[i//2], self.dui[i]
            i//=2
    def chudui(self):
        #这里出堆有个技巧就是说,用末尾元素代替头部元素进行,然后向下筛选
        cdys=self.dui[1]
        #用末尾元素代替头部元素
        if len(self.dui)-1==1:
            return self.dui[1]
        self.dui[1]=self.dui.pop()
        i=1
        weibu=len(self.dui)-1
        #这里分三种他情况 1.没有子节点 2.只有左子节点 3.左右子节点都有
        while 0<i<weibu:
            #1.没有子节点,结束
            if 2*i>weibu:
                break
            #2.只有左子节点
            if 2*i<=weibu and 2*i+1>weibu:
                if self.dui[i]>self.dui[2*i]:
                    #换位置
                    self.dui[i],self.dui[2*i]=self.dui[2*i],self.dui[i]
                i=2*i
            elif 2*i+1<=weibu:
                index=self.bijiao(i)
                if self.dui[i]>self.dui[index]:
                    # 换位置
                    self.dui[i],self.dui[index]=self.dui[index],self.dui[i]
                i=index
        return cdys
    def bijiao(self,i):
        if self.dui[2*i]<self.dui[2*i+1]:
            return 2*i
        else:
            return 2*i+1
class Solution(object):
    def getLeastNumbers_Solution(self, input, k):
        """
        :type input: list[int]
        :type k: int
        :rtype: list[int]
        """
        dui=Dui()
        for i in input:
            #全部入堆
            dui.rudui(i)
        list1=[]
        for i in range(k):
            list1.append(dui.chudui())
        return list1

快速排序代码

def ks(list1):
    if len(list1)>1:
        left=0
        right=len(list1)-1
        #取列表首位作为中值
        zhongzhi=list1[0]
        weibu=right
        #开始进行循环
        while left<right:
            #left从左往右走
            while left<=right and list1[left]<=zhongzhi: #只有碰到比他大的才会停下
                left+=1
            #此时left对应的值要比中值大
            while left<=right and list1[right]>=zhongzhi: #只有碰到比他小的才会停下
                right-=1
            #此时需要进行一个比较看left和right的值
            if left<right:
                #是可以换位置的
                list1[left],list1[right]=list1[right],list1[left]
        #当循环结束的时候,中值所应该处的位置就是right的位置
        list1[0],list1[right]=list1[right],list1[0]
        return ks(list1[:right:])+[zhongzhi]+ks(list1[right+1::])
    #没进来就return空列表
    return list1
class Solution(object):
    def getLeastNumbers_Solution(self, input, k):
        """
        :type input: list[int]
        :type k: int
        :rtype: list[int]
        """
        list1=ks(input)
        list2=[]
        for i in range(k):
            list2.append(list1[i])
        return list2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值