面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:
- 0 <= len(arr) <= 100000
- 0 <= k <= min(100000, len(arr))
解题思路
通过快速选择,我们可以将数组划分成两个区间A[l,i],B[i+1,r],A区间的所有元素均小于B区间
- 如果k刚好就是A区间的长度的话,说明我们已经找到了最小的k个数字
- 如果k大于A区间长度的话,说明我们要找的除了整个A区间以外,还有B区间的一部分元素
- 如果k小于A区间长度的话,说明我们需要找的数全部在A区间里面
代码
class Solution {public int[] smallestK(int[] arr, int k) {int[] res=new int[k];int l=0,r=arr.length-1,w=k;while(l<r){int i=partition(arr,l,r);int n=i-l+1;if(n==k){break;}else if(n<k){l=i+1;k-=n;}else {r=i;}}System.arraycopy(arr,0,res,0,w);return res;}public int partition(int[] arr, int l,int r) {int t=arr[l];while(l<r){while(l<r&&arr[r]>=t)r--;arr[l]=arr[r];while(l<r&&arr[l]<=t)l++;arr[r]=arr[l];}arr[l]=t;return l;}
}