目录
一、题目
输入整数数组 arr
,找出其中最小的 k
个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1 输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
二、思路
1、对数据排序取前k个元素
class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k == 0 || arr.length == 0) { return new int[0]; } int[] res = new int[k]; Arrays.sort(arr); for(int i =0;i<k;i++){ res[i] = arr[i]; } return res; } }
2、基于快排找前k个数
class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k == 0 || arr.length == 0) { return new int[0]; } return quickFind(arr, 0, arr.length - 1, k); } private 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); } return i+1 > k? quickFind(arr, 0, i - 1, k): quickFind(arr, i + 1, right, k); } private int partition(int[] arr, int left, int right) { int pivot = arr[left]; int i = left+1; int j = right ; while (i < j) { while (i <= j && arr[i] <= pivot) i++; while (i <= j && arr[j] >= pivot) j--; if (i >= j) { break; } int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } arr[left] = arr[j]; arr[j] = pivot; return j; } }