题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
解法一:
最简单粗暴的,直接进行全排序,使用快速排序时间复杂度为O(NlogN)。代码略。
解法二:
利用Partition函数。
这道题跟“数组中出现次数超过一半的数字”思路相似,只不过那道题目我们要找的是中位数,这道题目我们要找的是第k+1个数,只是位置有差别。
时间复杂度为O(N)。也是最优解。
public class Solution {
public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> result = new ArrayList<Integer>();
//切勿忘记考虑非法输入
if(k > input.length || input.length <= 0 || input == null || k <= 0)
return result;
int start = 0, end = input.length - 1;
int index = Partition(input, start, end);
while(index != k - 1) {
if(index > k - 1) {
end = index - 1;
index = Partition(input, start, end);
}
else {
start = index + 1;
index = Partition(input, start, end);
}
}
for(int i = 0; i < k; i++) {
result.add(input[i]);
}
return result;
}
public static int Partition(int[] array, int start, int end) {
int small = start - 1;
Random rand = new Random();
int index = rand.nextInt(end - start + 1) + start;
Swap(array, index, end);
for(index = start; index < end; index++) {
if(array[index] < array[end]) {
small++;
if(small != index)
Swap(array, index, small);
}
}
small++;
Swap(array, small, end);
return small;
}
public static void Swap(int[] array, int a, int b) {
int tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
}
网友评论