数组Running Sum问题求解:现有JS代码存疑,寻求优化及递归思路
解决数组累加和(Running Sum)问题的思路与修正方案
你的代码问题所在
你当前代码的bug出在else分支的计算逻辑上——你用了num + nums[idx - 1],但这里应该加的是累加结果数组里的前一项result[idx - 1],而不是原数组的前一个元素。举个例子,输入[3,1,2,10,1]时,第三个元素(索引2)的正确累加值是前一个累加结果4+2=6,但你的代码会计算2+1=3,这就导致结果错误。
修正后的迭代代码:
var runningSum = function(nums) { let result = []; nums.forEach(function(num, idx) { if (idx === 0) { result.push(num); } else { result.push(num + result[idx - 1]); // 改为取累加结果的前一项 } }); return result; }
更简便的解法
1. 原地修改数组(空间复杂度O(1))
如果题目允许修改原数组,这是最简洁高效的解法,不需要额外开辟结果数组:
var runningSum = function(nums) { for (let i = 1; i < nums.length; i++) { nums[i] += nums[i - 1]; } return nums; }
2. 使用reduce/map简化代码
利用JavaScript的数组方法可以一行搞定,逻辑清晰直观:
// 用map+累加变量的写法 var runningSum = function(nums) { let sum = 0; return nums.map(num => sum += num); } // 用reduce的写法 var runningSum = function(nums) { return nums.reduce((acc, curr) => { acc.push(acc.length ? acc.at(-1) + curr : curr); return acc; }, []); }
递归实现的思路
递归的核心是把问题拆解成子问题:
- 终止条件:当输入数组长度为1时,直接返回该数组(单个元素的累加和就是它本身)。
- 递归步骤:先递归计算前
n-1个元素的累加和数组,再将最后一个元素与递归结果的最后一项相加,拼接到结果末尾。
代码实现:
var runningSum = function(nums) { if (nums.length === 1) { return nums; } // 递归处理前n-1个元素 let prevSum = runningSum(nums.slice(0, -1)); // 计算当前最后一个元素的累加值并追加 prevSum.push(prevSum.at(-1) + nums.at(-1)); return prevSum; }
注意:递归的空间复杂度更高(存在调用栈开销),所以迭代解法通常是这类问题的最优选择,但递归可以帮助理解分治思想。
内容的提问来源于stack exchange,提问作者jo A
相关产品推荐
相关产品推荐

