剑指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方法,排完序即可。