繁体   English   中英

最大子数组,我不明白代码是如何工作的

[英]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

这是Kadane's Algorithm Largest Sum Subarray子数组算法的实现。

算法的要点是:

不要添加已经汇总为负数的子数组。 这只会进一步减少总和。

每次都必须更新结果,子数组的总和的值大于当前值


例如:这是在相关位置添加console.log的output。 在此处输入图像描述

Note: Here is the link where you can read more: https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/

如果您对结果行进行评论,基本上 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM