Tri*_*ins 3 javascript arrays sum max
我正在解决 CodeSignal 上的一些问题。我遇到了这个,arrayMaxConsecutiveSum。我让它通过了几乎所有测试,但最后一个测试超时了。如果我将测试转移到自定义测试中,它就会通过那里,所以我不知道该怎么做。我如何更好地编码以免超时?
问题:
给定整数数组,找到其 k 个连续元素中某些元素的最大可能总和。
示例:
对于 inputArray = [2, 3, 5, 1, 6] 且 k = 2,输出应为 arrayMaxConsecutiveSum(inputArray, k) = 8。2 个连续元素的所有可能和为:
2 + 3 = 5;
3 + 5 = 8;
5 + 1 = 6;
1 + 6 = 7。
因此,答案是 8。
function arrayMaxConsecutiveSum(inputArray, k) {
let max = 0;
for(let i = 0; i < inputArray.length; i++){
let sum = 0;
let newArr = inputArray.slice(i, i + k);
sum = newArr.reduce((accumulator, currentVal) => accumulator + currentVal);
if(sum > max){
max = sum;
}
}
return max;
}Run Code Online (Sandbox Code Playgroud)
错误:测试通过:19/20。测试 20 超出执行时间限制:程序超出执行时间限制。确保它在几秒钟内完成任何可能的输入的执行。
您当前的算法是O(n ^ 2)因为它需要嵌套循环。
O(n)您可以通过使用滚动总和来实现。从元素 0 到 的总和开始k,然后在每次迭代中减去组成总和的最早元素,并添加尚未包含在总和中的下一个元素。
例如,ak为 2:
等等。
function arrayMaxConsecutiveSum(inputArray, k) {
let rollingSum = inputArray.slice(0, k).reduce((a, b) => a + b);
let max = rollingSum;
for(let i = 0; i < inputArray.length - k; i++){
rollingSum += inputArray[i + k] - inputArray[i];
max = Math.max(max, rollingSum);
}
return max;
}
console.log(arrayMaxConsecutiveSum([2, 3, 5, 1, 6], 2));Run Code Online (Sandbox Code Playgroud)