会打怪物的小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)