题解 | #最小的K个数#

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param input int整型一维数组
 * @param k int整型
 * @return int整型一维数组
 */
function GetLeastNumbers_Solution(input, k) {
    // write code here
    if (k === 0) return [];
    if (k > input.length) return input;
    let stack = [];
    for (let i = 0; i < input.length; i++) {
        if (stack.length < k) {
			// 下面的插入元素是相同的逻辑,可以封装为函数
            let idx = getInsertIdx(stack, input[i]);
            if (idx === 0) {
                stack.unshift(input[i]);
            } else if (idx === stack.length + 1) {
                stack.push(input[i]);
            } else {
                stack.splice(idx, 0, input[i]);
            }
        } else {
            if (stack[0] > input[i]) {
                stack.shift();
                let idx = getInsertIdx(stack, input[i]);
                if (idx === 0) {
                    stack.unshift(input[i]);
                } else if (idx === stack.length + 1) {
                    stack.push(input[i]);
                } else {
                    stack.splice(idx, 0, input[i]);
                }
            }
        }
    }

    let res = [];
    while (stack.length) {
        res.push(stack.pop());
    }
    return res;
}

// 处理新元素插入位置
function getInsertIdx(arr, num) {
    if (arr.length === 0) return 0;
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] < num) {
            return i;
        }
    }
    return arr.length + 1;
}

module.exports = {
    GetLeastNumbers_Solution: GetLeastNumbers_Solution,
};

全部评论

相关推荐

OPSL:钱确实给的多,但是追责这一点比较迷惑…3个月具体如何计算呢?出勤天数30*3吗?还是21*3呢?万一中间学校有安排怎么办呢?这个得多问一问呀
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务