JavaScript求长度递减嵌套数组的对角线元素和
计算嵌套数组的对角线元素和(无需三重循环)
首先先明确你生成的嵌套数组outArr结构,帮你梳理清楚问题本质:
[ [0, 2, 4, 6, 8, 10], [0, 2, 4, 6, 8], [0, 2, 4, 6], [0, 2, 4], [0, 2], [0] ]
你期望的结果[0,2,6,12,20,30],本质是所有满足x + y = k的outArr[x][y]的和(k从0到5)。这里完全不需要用三重循环,甚至能找到更高效的解法:
最优解法:直接计算原数组的前缀和
仔细观察会发现,outArr[x][y]其实就是intArr[y](每个子数组都是intArr的前N项),而结果的第k项,恰好是intArr从第0项到第k项的累加和——也就是原数组的前缀和数组!
这种解法完全不需要处理嵌套数组,时间复杂度仅为O(n):
const intArr = [0,2,4,6,8,10]; const result = intArr.reduce((acc, curr, idx) => { acc.push(idx === 0 ? curr : acc[idx-1] + curr); return acc; }, []); console.log(result); // 输出: [0,2,6,12,20,30]
如果一定要基于嵌套数组计算(仍无需三重循环)
如果你想操作生成好的outArr,两层循环就足够完成任务:
let outArr = []; const intArr= [0,2,4,6,8,10]; for (let i = intArr.length; i >0; i--) { outArr.push(intArr.slice(0,i)); } const result = []; const maxK = outArr.length - 1; for (let k = 0; k <= maxK; k++) { let sum = 0; // 遍历所有x从0到k,对应y = k - x for (let x = 0; x <= k; x++) { sum += outArr[x][k - x]; } result.push(sum); } console.log(result); // 输出: [0,2,6,12,20,30]
你也可以用数组方法简化代码,一行完成计算:
const result = Array.from({length: outArr.length}, (_, k) => outArr.slice(0, k+1).reduce((sum, subArr, x) => sum + subArr[k - x], 0) );
结论
完全不需要使用三重循环,无论是基于原数组的前缀和解法,还是基于嵌套数组的两层循环解法,都能高效得到你想要的结果。其中前缀和解法的效率最高,是最优选择。
内容的提问来源于stack exchange,提问作者Yolo_chicken
相关产品推荐
相关产品推荐

