题目:
输入n个整数,找出其中最小的k个数。例如输入4、 5、 1、 6、 2、 7、 3、 8这8个数字,则最小的4个数字是1、 2、 3、 4。
思路:O(n)的算法,只有当我们可以修改输入的数组是可用
经典常用的算法,快速排序的精髓利用快速排序划分的思想,每一次划分就会有一个数字位于以数组从小到达排列的的最终位置index;位于index左边的数字都小于index对应的值,右边都大于index指向的值;所以,当index > k-1时,表示k个最小数字一定在index的左边,此时,只需要对index的左边进行划分即可;当index < k - 1时,说明index及index左边数字还没能满足k个数字,需要继续对k右边进行划分
代码实现:
public ArrayList<Integer> getLeastNumbers(int nums[], int k){
ArrayList<Integer> list = new ArrayList<Integer>();
int lens = nums.length;
if(nums == null || lens == 0 || k > lens || k <= 0){
return list;
}
int start = 0;
int end = lens - 1;
int index = partition(nums, start, end);
while(index != k-1){
if(index >