题目挺简单的,我直接用了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