6.小E的怪物挑战

68 阅读1分钟

会打怪物的小E,如何打倒更多的怪物,这道题采用动态规划的解法:

function solution(n, H, A, h, a) {
    // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
    // write code here
    // 记录打败的小怪兽,先对数组进行初始化
    const defeatArr = new Array(n).fill(0)
    for (let i = 1; i < n; i++) {
        // 击败血量和攻击力都小于她当前属性的怪物,并且 后一个怪物的血量和攻击力必须大于前一个
        for (let j = 0; j < i; j++) {
            // 检查是否满足击败条件,并且后一个怪物的血量和攻击力都大于前一个
            if (H > h[i] && A > a[i] && h[i] > h[j] && a[i] > a[j]) {
                // 遍历 这个数组, 取最大的击败数+1
                defeatArr[i] = Math.max(defeatArr[i], defeatArr[j] + 1)
            }
        }
    }
    return Math.max(...defeatArr);
}

function main() {
    console.log(solution(3, 4, 5, [1, 2, 3], [3, 2, 1]) === 1);
    console.log(solution(5, 10, 10, [6, 9, 12, 4, 7], [8, 9, 10, 2, 5]) === 2);
    console.log(solution(4, 20, 25, [10, 15, 18, 22], [12, 18, 20, 26]) === 3);
    console.log(solution(14, 15, 6, [15, 4, 10, 15, 2, 6, 16, 10, 17, 17, 6, 9, 14, 3], [10, 8, 6, 7, 7, 1, 17, 3, 3, 4, 1, 2, 4, 13]) === 3);
}

main();

空间复杂度: 一个用于记录打败小怪兽的最大数量的数组 defeatArr 的长度为 n

时间复杂度: for 的双层循环,时间复杂度为 O(n^2)