[英]Maximum Subarray, i can't understand how the code works
有一个 function 可以找到子数组中的最大和
var maxSubArray = function(nums) {
if(nums.length == 0) return 0;
let result = Number.MIN_SAFE_INTEGER;
let sum = 0;
for(let i = 0; i < nums.length; i++) {
sum += nums[i];
result = Math.max(sum, result);
sum = sum < 0 ? 0 : sum;
}
return result;
};
console.log(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]));
但是我无法理解如果删除以下行会发生什么变化以及为什么它会停止工作:'result = Math.max(sum, result);'
并将返回结果更改为 sum
如果您对结果行进行评论,基本上 function 不会有之前“最佳总和候选人”的 memory。 它只会在数组上运行,将值添加到sum
变量,即使它降低了 sum 的值(这是您无法避免的,只有在您跟踪以前的最佳求和候选者时才有用)。
为了进一步解释,假设您评论该行并返回sum
。 每次总和结果为负时,它将立即重置为 0。因此,在您提出的示例中,最终的最大子数组将有效地开始对4
求和,如果sum
大于零,即使如果添加新值后,总和小于其先前值。
所以基本上它会像这样 go :
[-2] // sum = -2. Less than 0, so reset to sum = 0
[-2, 1] // sum = 1
[-2, 1, -3] // sum = -2. Less than 0, so reset to sum = 0
[-2, 1, -3, 4] // sum = 4
[-2, 1, -3, 4, -1] // sum = 3
[-2, 1, -3, 4, -1, 2] // sum = 5
[-2, 1, -3, 4, -1, 2, 1] // sum = 6 BEST SUM
[-2, 1, -3, 4, -1, 2, 1, -5] // sum = 1 :(
[-2, 1, -3, 4, -1, 2, 1, -5, 4] // sum = 5
这就是为什么可变result
是必要的。 您必须跟踪迄今为止的最佳总和,并将其与“本地最佳”进行比较,可以这么说。
在原始代码中,state 在整个迭代过程中看起来像这样:
[-2]
// sum = -2
// result = -2 because -2 is greater than Number.MIN_SAFE_INTEGER.
// sum = 0. It gets reset because it's negative
[-2, 1]
// sum = 1
// result = 1 because 1 > -2
[-2, 1, -3]
// sum = -2
// result = 1 and isn't updated because the overall max sum so far is greater than the current sum
// sum = 0
[-2, 1, -3, 4]
// sum = 4
// result = 4
[-2, 1, -3, 4, -1]
// sum = 3
// result = 4 and isn't updated because the overall max sum is greater than the current sum
[-2, 1, -3, 4, -1, 2]
// sum = 5
// result = 5
[-2, 1, -3, 4, -1, 2, 1]
// sum = 6 BEST SUM
// result = 6
[-2, 1, -3, 4, -1, 2, 1, -5]
// sum = 1
// result = 6
[-2, 1, -3, 4, -1, 2, 1, -5, 4]
// sum = 5
// result = 6
如您所见,最终值现在是 6,因为总最大总和保留在result
变量中,而sum
跟踪局部最佳值。
它正在添加所有相邻元素以获得具有最大总和的子数组。
在上面的例子中,子数组是[4,-1,2,1]
总和小于 6 的所有其他子数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.