题解 | #寻找第K大#

寻找第K大

https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf?tpId=295&tqId=44581&ru=/exam/company&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Fcompany

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param a int整型一维数组
 * @param n int整型
 * @param k int整型
 * @return int整型
 */
function findKth(a, n, k) {
    // write code here
    if (n === 0) return [];
    let stack = [];
    for (let i = 0; i < n; i++) {
        if (stack.length < k) {
			// stack长度小于k时 先填满stack
            let idx = getInsertIdx(stack, a[i]);
            if (idx === 0) {
                stack.unshift(a[i]);
            } else if (idx === stack.length + 1) {
                stack.push(a[i]);
            } else {
                stack.splice(idx, 0, a[i]);
            }
        } else {
			// stack长度等于k时,根据新的元素应该插入的位置 做不同处理
            let idx = getInsertIdx(stack, a[i]);
			// 在stack首位置插入,诞生了一个新的最大数,则第k大数易位,末尾砍掉
            if (idx === 0) {
                stack.unshift(a[i]);
                stack.pop()
            } else if (idx === stack.length + 1) {
 				// 在stack尾位置插入,说明该数小于当前第k大 什么也不用做
            } else {
			 	// 在stack中间位置插入,第k大数易位,移除尾部元素
                stack.splice(idx, 0, a[i]);
                stack.pop()
            }
        }
    }
    return stack.pop();
}

// 获取元素插入位置
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 = {
    findKth: findKth,
};

和【BM46 最小的K个数】思路相同,维护一个顶根堆,长度为k,堆尾就是第k大的数

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务