leetcode 1383 最大的团队表现值

570 阅读1分钟

效率有点低, 后面再想一下

 * @param {number} n
 * @param {number[]} speed
 * @param {number[]} efficiency
 * @param {number} k
 * @return {number}
 * 暴力循环, 以每个人的效率作为最低效率,另外选取最多k - 1个速度最大的人,加上被选中的那个人共k个人作为总的被选中的人,其中表现值最大的就是答案
 * 时间复杂度O(nlog(k - 1))
 */
// 因为中间要比大小, 所以无法对中间值求余, 那么数值必然会超过2 ** 53,只能用BigInt了
const mod = BigInt(10 ** 9 + 7)
var maxPerformance = function(n, speed, efficiency, k) {
    const pairs = speed.map((v, k) => [v, efficiency[k]])
    pairs.sort((a, b) => b[1] - a[1])
    let sum = 0
    let ans = 0n
    const queue = []
    const limit = k - 1
    for(let x of pairs) {
        if(queue.length > limit) {
            const temp = queue.pop()
            sum -= temp
        }
        let tempAns = BigInt(x[0] + sum) * BigInt(x[1])
        if(tempAns > ans) ans = tempAns
        insert(queue, x[0])
        sum = sum + x[0]
    }
    return ans % mod
};

// js没有优先队列, 只能自己用二分查找方法模拟一个优先队列
function insert(arr, e) {
    let l = 0
    let r = arr.length
    let m = undefined
    while(l <= r) {
        m = ((l + r) / 2) | 0
       if(e < arr[m]) {
            l = m + 1
        } else if(e > arr[m]) {
           r = m - 1
       } else  {
            l = m
            break
        }
    }
    // 如果e不存在于数组arr中,那么找到的l是小于e的数的位置上
    // 如果e存在于数组中, 那就是等于e的数的位置上
    // 主要注意, splice会把原来位置的数往后挤,而不是把e放到原来数下一个位置
    if(arr[l] >= e) {
        arr.splice(l + 1, 0, e)
    } else arr.splice(l, 0, e)
}```