面试题 17.14. 最小K个数
题目
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))
解法
解法1
使用Arrays
的快排方法,取前K
个返回
class Solution {
public int[] smallestK(int[] arr, int k) {
Arrays.sort(arr);
int[] arrMin = new int[k];
for (int i = 0; i < arrMin.length; i++) {
arrMin[i] = arr[i];
}
return arrMin;
}
}
解法2
注意到任意顺序返回即可.那我们可以在快排中做一些修改,当排序后的基准数下标+1等于K
时,说明在基准数左边的全是比K
小的,也就是最小K
个数
class Solution {
public static int[] smallestK(int[] arr, int k) {
int left = 0, right = arr.length - 1, index = 0;
int[] arrMin = new int[k];
if (k == 0) return arrMin;
while (true) {
index = left;
int i = left, j = right;
while (j > i) {
while (i < j && arr[j] >= arr[index]) j--;
while (i < j && arr[i] <= arr[index]) i++;
swap(arr, i, j);
}
swap(arr, index, i);
index = i;
if (index + 1 == k) break;
if (index < k) left = index + 1;
else right = index - 1;
}
for (int i = 0; i < arrMin.length; i++) {
arrMin[i] = arr[i];
}
return arrMin;
}
public static void swap(int[] arr, int i, int j) {
int num = arr[i];
arr[i] = arr[j];
arr[j] = num;
}
}