剑指 Offer 40. 最小的k个数(快排)
不好返回的是时候,就用void,然后在主函数中返回。
思路是在快排中只增加了一句话:
if(k == i)
return;
如果基准数的下标,和k相等,就return。
假如k=7,数组下标为7的时候是第 8个数,第8个数前的数都比第8个数小。
其实在像解答里在arr[i] = pivot;之后判断,可以判断if(k == i + 1),因为前6个数加上基准数也属于题目要求。
class Solution { int k; public int[] getLeastNumbers(int[] arr, int k) { if (k >= arr.length) return arr; this.k = k; QuickSort(arr, 0, arr.length - 1); return Arrays.copyOf(arr, k); } void QuickSort(int[] arr, int left, int right){ if(left >= right) return ; int i = left, j = right, pivot = arr[i]; while(i < j){ while(i < j && arr[j] >= pivot) j--; arr[i] = arr[j]; while(i < j && arr[i] <= pivot) i++; arr[j] = arr[i]; } arr[i] = pivot; if(k == i) return; QuickSort(arr, left, i - 1); QuickSort(arr, i + 1, right); } }
如果剪枝速度将会更快,其实就是在递归时加了判断,避免不必要的递归。
class Solution { int k; public int[] getLeastNumbers(int[] arr, int k) { if (k >= arr.length) return arr; this.k = k; QuickSort(arr, 0, arr.length - 1); return Arrays.copyOf(arr, k); } void QuickSort(int[] arr, int left, int right){ if(left >= right) return ; int i = left, j = right, pivot = arr[i]; while(i < j){ while(i < j && arr[j] >= pivot) j--; arr[i] = arr[j]; while(i < j && arr[i] <= pivot) i++; arr[j] = arr[i]; } arr[i] = pivot; if(k == i) return; if(k < i) QuickSort(arr, left, i - 1); if(k > i) QuickSort(arr, i + 1, right); } }