题目描述
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
Array方法
| 标题 | 描述 |
|---|---|
| slice() | 选择数组的一部分,并返回新数组 |
| splice() | 从数组中添加/删除数组 |
解题思路1
- sort()完成排序,然后截取前k个数
代码1
var smallestK = function(arr, k) {
let ans = [];
if(k == 0) return ans;
// return arr.sort((a, b) => a - b).slice(0, k);
// return arr.sort((a, b) => a - b).splice(0, k);
arr = arr.sort((a, b) => a - b);
while(k) ans.push(arr[--k]);
return ans;
};
解题思路2
- 三路排序法
代码2
var smallestK = function(arr, k) {
let ans = [];
if(k == 0) return ans;
quick_select(arr, 0, arr.length - 1, k);
while(k) ans.push(arr[--k]);
return ans;
};
var getmid = function(a, b, c){
if(a > b) [a, b] = [b, a];
if(a > c) [a, c] = [c, a];
if(b > c) [b, c] = [c, b];
return b;
}
var quick_select = function(arr, l, r, k){
if(l >= r) return ;
let x = l, y = r, mid = getmid(arr[l], arr[(l + r) / 2 | 0], arr[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){
quick_select(arr, l, y, k);
} else {
quick_select(arr, x, r, k - x + l);
}
return ;
}