思路:
1.二分法,得到index,左边的数比index位置数小,右边比它大
2.直到index == k - 1, 选择 0 到 k -1 下标的数就是最小的k个数
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if (input == null || input.length == 0 || k <= 0 || input.length < k) {
return new ArrayList<Integer>();
}
//方法一 排序 前面k个数 O(nlogN)-O(n2)
//方法二 快速排序中 使得左边都小于第K个元素 O(n)
int start = 0;
int end = input.length - 1;
int index = parition(input, start, end);
while(index != k - 1){
if(index > k - 1){
end = index - 1;
}else {
start = index + 1;
}
index = parition(input, start, end );
}
ArrayList<Integer> result = new ArrayList<>();
for (int i = 0; i < k; i++) {
result.add(input[i]);
}
return result;
}
private static int parition(int[] data, int left, int right) {
//随机选择二分法的基准数据
int index = new Random().nextInt(right - left + 1);
int value = data[index + left];
data[index + left] = data[left];
data[left] = value;
int j = left;
for(int i = left+1; i <= right ; i++){
//当前j赋值i,然后下一个数放在i的位置上,j 到 i之间的数是比value大的数
if(data[i] < value){
data[j] = data[i];
j ++;
data[i] = data[j];
}
}
data[j] = value;
return j;
}
}