求数组连续子数组最大和的JavaScript代码调试求助
修正连续子数组最大和的JavaScript实现
你的代码核心问题在于初始化maxSum为0,当输入数组全为负数时,所有可能的连续子数组和都是负数,而0会被错误地当作最大和返回,这就是全负测试用例失败的原因。
修正后的代码
function maxSubarraySum(arr) { // 处理空数组边界场景(可根据需求调整返回值) if (arr.length === 0) return 0; let maxSum = arr[0]; let currentSum = arr[0]; for (let i = 1; i < arr.length; i++) { // 决定是否将当前元素加入前序子数组,或重新开启新子数组 currentSum = Math.max(arr[i], currentSum + arr[i]); // 更新全局最大和 maxSum = Math.max(maxSum, currentSum); } return maxSum; }
关键逻辑说明
- 初始化调整:将
maxSum和currentSum初始化为数组第一个元素,直接规避全负场景下0的干扰。 - 子数组选择逻辑:遍历过程中,
currentSum取「当前元素本身」和「当前元素+前序子数组和」的较大值——如果前序子数组和为负,就舍弃它,从当前元素重新开始计算子数组和。 - 全局最大值更新:每次迭代都比较并更新
maxSum,确保始终记录遍历过程中出现的最大子数组和。
测试验证
- 原测试用例:
maxSubarraySum([1, -2, 3, 10, -4, 7, 2, -5])→ 输出18,符合预期 - 全负测试用例:
maxSubarraySum([-1, -2, -3, -4, -5])→ 输出-1,符合预期 - 单元素负数:
maxSubarraySum([-5])→ 输出-5,正确 - 混合场景:
maxSubarraySum([-2, 1, -3, 4, -1, 2, 1, -5, 4])→ 输出6(对应子数组[4, -1, 2, 1]),正确
内容的提问来源于stack exchange,提问作者user18847228
相关产品推荐
相关产品推荐

