输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:排序,然后取前k个O(nlogn)
剑指解法:考虑之前的题目,数组中出现次数超过一半的数字,如果基于数组的第k个数字来调整,比其小的都位于左边,大的都位于右边。
方法一:基于划分的方法,查找第K个数字,第一次划分之后,划分的位置如果大于k,那么就在前面的子数组中继续进行划分,反之则在后面的子数组中继续划分
方法二:待续
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if tinput ==None or len(tinput)
n = len(tinput)
start = 0
end = n-1
index = self.Partition(tinput,n,start,end)
while index!= k-1:
if index > k-1:
end = index - 1
index = self.Partition(tinput,n,start,end)
else:
start = index + 1
index = self.Partition(tinput,n,start,end)
output = tinput[:k]
output.sort()
return output
def Partition(self,numbers,length,start,end):
if numbers == None or length<=0 or start<0 or end>=length:
return None
if end==start:
return end
pivotvlue = numbers[start]
leftmark = start + 1
rightmark = end
done = False
while not done:
while numbers[leftmark]<=pivotvlue and leftmark<=rightmark:
leftmark +=1
while numbers[rightmark]>=pivotvlue and rightmark>=leftmark:
rightmark -=1
if leftmark>rightmark:
done = True
else:
numbers[leftmark],numbers[rightmark] = numbers[rightmark],numbers[leftmark]
return rightmark
方法一报错:啊啊啊啊啊啊啊啊啊啊啊啊啊
不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为42.86%
测试用例:
[4,5,1,6,2,7,3,8],1
对应输出应该为:
[1]
你的输出为:
[4]