class Solution {
//在数组有序的情况下,并且k=arr.length,此时时间复杂度最坏为O(n^2)(n次递归调用,每一个递归调用的时间复杂度为O(N))
//空间复杂度最坏为O(n)(n次递归调用,每一次递归调用空间占用为常量级别)。
public int[] getLeastNumbers(int[] arr, int k) {
quickSortTopK(arr, 0, arr.length - 1, k);
int[] res = new int[k];
for (int i = 0; i < k; i ++) {
res[i] = arr[i];
}
return res;
}
private void quickSortTopK(int[] arr, int left, int right, int k) {
if (left >= right) {
return;
}
int i = left, j = right;
int baseVal = arr[left];//选取最左边的元素作为基准值
while (i < j) {
while (i < j && arr[j] >= baseVal) {
j --;
}
while (i < j && arr[i] <= baseVal) {
i ++;
}
if (i < j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
arr[left] = arr[i];//赋值下一次递归的基准值
arr[i] = baseVal;//找到了基准值升序排列的位置
if (i == k) {
return;
} else if (i > k) {
quickSortTopK(arr, left, i - 1, k);
} else {
quickSortTopK(arr, i + 1, right, k);
}
}
}
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if (arr.length == 0 || k == 0) {
return new int[0];
}
return quickFind(arr, 0, arr.length - 1, k);
}
public int[] quickFind(int[] arr, int left, int right, int k) {
int i = partition(arr, left, right);
if (i + 1 == k) {
return Arrays.copyOf(arr, k);
}
if(i + 1 > k) {
return quickFind(arr, 0, i - 1, k);
} else {
return quickFind(arr, i + 1, right, k);
}
}
public int partition(int[] arr, int left, int right) {
int pivot = arr[left];
int i = left;
int j = right;
while (i < j ) {
while (i < j && arr[j] >= pivot) {
j--;
}
while (i < j && arr[i] <= pivot) {
i++;
}
if (i >= j) {
break;
}
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
arr[left] = arr[j];
arr[j] = pivot;
return j;
}
}
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if (k >= arr.length) {
return arr;
}
return quickFind(arr, 0, arr.length - 1, k);
}
public int[] quickFind(int[] arr, int low, int high, int k) {
int i = low, j = high;
int povit = arr[low];
while (i < j) {
while ((i < j) && povit <= arr[j]) {
j--;
}
while ((i < j) && povit >= arr[i]) {
i++;
}
if (i != j) {
exchange(arr, i, j);
}
}
exchange(arr, low, i);
if (i > k) {
return quickFind(arr, low, i - 1, k);
}
if (i < k) {
return quickFind(arr, i + 1, high, k);
}
return Arrays.copyOf(arr, k);
}
public void exchange(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
共以下 5 个回答
先排序,然后输出最小的k个
快排