题解 | #寻找第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大的数