题目链接
这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数,这种思路的时间复杂度为O(NlogN)。
但是上面的算法并不是最快的,还有一种思想,可以从jz039中得到启发,我们也同样可以基于Partition函数来解决问题。如果基于数组的第k个数字来调整,则使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都在数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k个数字(这k个数字不一定是排序的)。代码如2所示,随机选择pivot可以让平均情况更快,否则容易被某些特例拖长时间。这个算法的时间复杂度是O(N),空间复杂度由于是在原地排序所以是O(1)。
第三个方法是用堆来实现,见3,之后来更新。