[路飞]_面试题 17.14. 最小K个数

96 阅读1分钟

题目路径

题目描述

设计一个算法,找出数组中最小的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 ;
}