版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mabozi08/article/details/88863134
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:当可以修改输入数组的时候,可以采用时间复杂度为O(n)的算法
采用快速排序的思路。如果基于数组的第K个数字来调整,则使得比K个数字小的所有数字都位于数组的左边,大的都位于右边。调整后,位于数组中左边的K个数字就是最小的K个数字。
# -*- coding:utf-8 -*-
import random
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if not input or k<=0 or k>len(tinput):
return []
output = []
start = 0
end = len(tinput)-1
index = self.Partition(tinput, len(tinput), start, end)
while (index!=k-1):
if index>k-1:
end = index-1
index = self.Partition(tinput, len(tinput), start, end)
else:
start = index+1
index = self.Partition(tinput, len(tinput), start, end)
for i in range(0,k):
output.append(tinput[i])
return sorted(output)
def Partition(self, data, length, start, end):
if not data:
return None
index = random.randint(start, end)
data[index], data[end] = data[end], data[index]
small = start - 1
for i in range(start,end):
if data[i]<data[end]:
small+=1
if small!=i:
data[i], data[small] = data[small], data[i]
small+=1
data[small], data[end] = data[end], data[small]
return small