问题描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:
这个算是面试中常见题了,这里总结一下解决方法(注意判断k的合法性):
1、全部升序排序,输出前k个数字,最小时间复杂度为
2、由于不要求最小的k个数按序输出,参考快排中partition函数思想:每轮排序之后枢轴左边数字都比它小,右边数字都比它大。因此如果排序之后枢轴刚好处于数组的第k个位置,那么此时数组的前k个数字也即是最小的k个数
这种思想经证明是O(n)的时间复杂度(有兴趣的可以参考《算法导论》)
代码实现如下:
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
n = len(tinput)
if k <= 0 or k > n:
return list()
start = 0
end = n - 1
mid = self.partition(tinput, start, end)
while k - 1 != mid:
if k - 1 > mid:
start = mid