我写了一个程序来计算数组项的范围的和,但是仍然不能通过测验,因为我的代码太慢了:“执行超时(12000毫秒)”谁能说我如何加速我的代码来通过测验呢?
问答-https://www.codewars.com/kata/583d171f28a0c04b7c00009c/train/JavaScript
null
function maxSum(arr,range){
let result =-Infinity
range.forEach(el=>{
let sumArr = arr.slice(el[0],el[1]+1).reduce((a,b)=>a+b)
sumArr>result && (result=sumArr)
})
console.log(result)
return result
}
maxSum([1,-2,3,4,-5,-4,3,2,1],[[0,8],[1,3],[0,4],[6,8]])
null
这里有一个更快更简单的解决方案。 在range
上只迭代一次并收集所有总和,然后将其映射到总和范围,然后返回最大值:
null
function maxSum(arr, range) {
let left = [0];
let total = 0;
for (let num of arr) {
left.push(total += num);
}
let sums = range.map(([a, b]) => left[b + 1] - left[a]);
let result = Math.max(...sums);
console.log(result);
return result;
}
maxSum([1, -2, 3, 4, -5, -4, 3, 2, 1], [[0, 8], [1, 3], [0, 4], [6, 8]]);