40-最小的k个数
大约 1 分钟
输入整数数组
arr
,找出其中最小的k
个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
最简单的-排序
直接排序,然后取前k个即可。
public int[] getLeastNumbers(int[] arr, int k) {
if (arr == null || arr.length == 0 || k == 0) {
return new int[0];
}
Arrays.sort(arr);
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = arr[i];
}
return result;
}
快排思想
快排在每一次操作后,都会确定一个元素的位置,假如这个元素的索引刚好是k-1,那么说明前k个元素就是所需要的。
public int[] getLeastNumbers2(int[] arr, int k) {
if (arr == null || arr.length == 0 || k == 0) {
return new int[0];
}
sort(arr, 0, arr.length - 1,k);
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = arr[i];
}
return result;
}
public void sort(int[] arr,int lo,int hi,int k) {
if (lo >= hi) {
return;
}
int partition = partition(arr, lo,hi);
//如果找到了对应的partition则返回即可
if (partition == k - 1) {
return;
}
sort(arr, lo, partition - 1,k);
sort(arr, partition + 1, hi,k);
}
public int partition(int[] arr, int start, int end) {
int i = start;
int pivot = arr[start];
for (int j = start + 1; j <= end; j++) {
if (arr[j] <= pivot) {
swap(arr, ++i, j);
}
}
swap(arr, start, i);
return i;
}
public static void swap(int[] numbers, int i, int j) {
int tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
不过上面代码还是会进行多余的排序操作,实际上可以参考39里的快排使用方法。