【剑指offer】29 数组中最小的K个数

剑指offer-29 数组中最小的K个数

一、题目描述

 给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组。

输入:[4,5,1,6,2,7,3,8],4 

返回:[1,2,3,4]

二、解题步骤

1.解题思路

    取出最小的K个数字,需要两步:(1)首先需要对数组的排序 (2)对排完序的数组通过切片的方式拿出

2.代码实现

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if k>len(tinput):return 
        # 选择用快速排序
        #定义快速排序函数 因为是递归所以需要用到三个参数
        def quick_sort(array,left,right):
            # l ,r 代表数组的起始与末尾索引
            if left >= right: return
            #可以把array[left]定义为哨兵元素
            temp=array[left]
            #定义哨兵
            i,j=left,right
            #开始判断,如果两个哨兵满足
            while(i<j):
                #从右向左开始判断,找到第一个比起始元素小的数
                while(i<j and array[j]>=temp):
                    j-=1
                #从左向右开始找,找到第一个比起始元素大的数
                while(i<j and array[i]<=temp):
                    i+=1
                #找到两个符合条件的数之后,开始交换
                #因为此时的array[j]是小于哨兵元素的,array[i]是大于哨兵元素的
                #也就是array[j]<array[i]
                #所以此时需要将array[j]和array[i]交换
                t=array[i]
                array[i],array[j]=array[j],t
            #遍历结束 此时的位置信息中i和j已经重合,将此时i和j指向的位置的元素与哨兵元素交换
            t=array[left]
            array[left]=array[i]
            array[i]=t
            #开始递归
            quick_sort(array,left,i-1)
            quick_sort(array,i+1,right)
        quick_sort(tinput, 0, len(tinput)-1)
        return tinput[:k]
            

3. 总结

      将数组排完序,取出即可,排序方式有多种方式,可以通过快速排序,堆排序,或者使用sorted方法,排完序即可。

   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值