leetcode 面试题 17.14. 最小K个数
问题描述: 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
思路: 1.采用快速排序的方法 2.基准值的获取我们采用三个值取中间值
/**
* @param {number[]} arr
* @param {number} k
* @return {number[]}
*/
var smallestK = function(arr, k) {
quickSort(arr,0,arr.length-1,k);
return arr.slice(0,k)
};
function quickSort(arr,l,r,k){
if(l>=r)return;
let mid=getMid(arr[l],arr[r],arr[Math.floor((l+r)/2)]);
let x=l,y=r;
do{
while(arr[x]<mid)x++;
while(arr[y]>mid)y--;
if(x<=y){
[arr[x],arr[y]]=[arr[y],arr[x]];
x++;
y--;
}
}while(x<=y);
if(y-l==k-1)return;
if(y-l>=k) quickSort(arr,l,y,k);
else{
quickSort(arr,x,r,k-x+l);
}
}
function getMid(a,b,c){
if(a>b)[a,b]=[b,a];
if(b>c)[b,c]=[c,b];
if(a>b)[a,b]=[b,c];
return b;
}