如何从二维数组中找出元素和最大的子数组?
修改方案
你不需要单独存储所有子数组的和,只需要在遍历过程中同时追踪当前最大和以及对应的子数组即可。以下是修改后的代码:
const sumof2dArray = (arr) => { // 初始化最大和为第一个子数组的和,对应的子数组为第一个子数组 let maxSum = arr[0].reduce((acc, curr) => acc + curr, 0); let maxSubarray = arr[0]; // 从第二个子数组开始遍历 for(let i = 1; i < arr.length; i++){ // 计算当前子数组的和 const currentSum = arr[i].reduce((acc, curr) => acc + curr, 0); // 如果当前和更大,更新最大和与对应的子数组 if(currentSum > maxSum){ maxSum = currentSum; maxSubarray = arr[i]; } } return maxSubarray; } console.log(sumof2dArray([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]])); // 输出: [1,3,40]
关键修改点:
- 去掉了存储所有和的
newArr,改用maxSum和maxSubarray两个变量直接追踪目标值 - 使用
Array.reduce()简化子数组求和的代码(你也可以保留原来的嵌套循环求和方式,效果一致) - 遍历过程中实时比较当前子数组和与最大和,一旦更大就更新对应的子数组
- 最终返回的是
maxSubarray而非最大和
如果你想保留原来的嵌套循环求和方式,修改后的代码可以是这样:
const sumof2dArray = (arr) => { let maxSum = 0; let maxSubarray = arr[0]; // 先计算第一个子数组的和 for(let j = 0; j < arr[0].length; j++){ maxSum += arr[0][j]; } for(let i = 1; i < arr.length; i++){ let currentSum = 0; for(let j = 0; j < arr[i].length; j++){ currentSum += arr[i][j]; } if(currentSum > maxSum){ maxSum = currentSum; maxSubarray = arr[i]; } } return maxSubarray; } console.log(sumof2dArray([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]])); // 输出: [1,3,40]
内容的提问来源于stack exchange,提问作者Scaplog
相关产品推荐
相关产品推荐

