面试题 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))
通过次数12,305提交次数22,434

/**
 * @param {number[]} arr
 * @param {number} k
 * @return {number[]}
 */
const KSmall = (arr, k) => {
    if(k <= 0) return [];
    if(arr.length <= k) return arr;
    const [sb, sa] = partition(arr);
    return KSmall(sb, k).concat(KSmall(sa, k-sb.length));
};

const partition = (arr) => {
    const sa = [];
    const sb = [];

    // swap
    const index = Math.floor(Math.random() * arr.length) ;
    const temp = arr[0];
    arr[0] = arr[index];
    arr[index] = temp;

    for(let i=1;i arr[0] ? sa.push(arr[i]) : sb.push(arr[i]);
    }
    sa.length < sb.length ? sa.push(arr[0]) : sb.push(arr[0]);
    return [sb, sa];
}

var smallestK = function(arr, k) {
    return KSmall(arr, k);
};

 

你可能感兴趣的:(LeetCode)