Javascript算法最大子数组
Javascript Algorithm Maximum subarray
我从 leet 代码中得到了这个问题,我从 YouTube 教程中得到了这个答案,但我不明白 max 的部分。因为 max 是 arr[0]
而 value 是 -2
,即使它进入循环内部,它只是 -2
但 max returns value 6
.
怎么可能?
const givenArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
const getMax = arr => {
let sum = arr[0]; //-2
let max = arr[0]; //-2
for (let i = 1; i < arr.length; i++) {
sum = Math.max(sum + arr[i], arr[i]);
max = Math.max(max, sum);
}
console.log(sum);
console.log(max);
};
getMax(givenArray);
max=-2 sum=-2
循环 arr[1]=1: sum = max( -2 + 1, 1) = 1, max = max( sum=1 , max=-2 ) = 1
max=1 总和=1
循环arr[2]=-3: sum = max( 1 + -3, -3) = -2, max = max( sum=-2, max=1 ) = 1
max=1 总和=-2
循环 arr[3]=4: sum = max( -3 + 4, 4) = 4, max = max( sum=4, max=1 ) = 4
max=4 总和=4
循环 arr[4]=-1: sum = max( 4 + -1, -1) = 3, max = (3,4) = 4
max=4 总和=3
循环arr[5]=2: sum = max( 3 + 2, 2) = 5, max = max(5,4) = 5
所以迭代看起来像这样:
arr [-2, 1, -3, 4, -1, 2, 1, -5, 4]
sum x, 1, x, 4, 3, 5, 6, 1, 5
max -2, 1, 1, 4, 4, 5, 6, 6, 6
这就像找到累进和、丢弃负序列或在和为负时开始一个新序列,因为任何负序列都会对序列的总和产生负面影响。
并且,你使用max = Math.max(max, sum),(将max设置为当前最大值或当前总和中较大的那个)来找到累进总和中达到的最大值(即6 ).
这也说明了所有负数的边缘情况,其中最大和将是最大的负数。
const givenArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
const getMax = arr => {
let sum = arr[0]; //-2
let max = arr[0]; //-2
for (let i = 1; i < arr.length; i++) {
sum = Math.max(sum + arr[i], arr[i]);
max = Math.max(max, sum);
console.log(`max=${max}`, `sum=${sum}`);
}
};
getMax(givenArray);
我从 leet 代码中得到了这个问题,我从 YouTube 教程中得到了这个答案,但我不明白 max 的部分。因为 max 是 arr[0]
而 value 是 -2
,即使它进入循环内部,它只是 -2
但 max returns value 6
.
怎么可能?
const givenArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
const getMax = arr => {
let sum = arr[0]; //-2
let max = arr[0]; //-2
for (let i = 1; i < arr.length; i++) {
sum = Math.max(sum + arr[i], arr[i]);
max = Math.max(max, sum);
}
console.log(sum);
console.log(max);
};
getMax(givenArray);
max=-2 sum=-2
循环 arr[1]=1: sum = max( -2 + 1, 1) = 1, max = max( sum=1 , max=-2 ) = 1
max=1 总和=1
循环arr[2]=-3: sum = max( 1 + -3, -3) = -2, max = max( sum=-2, max=1 ) = 1
max=1 总和=-2
循环 arr[3]=4: sum = max( -3 + 4, 4) = 4, max = max( sum=4, max=1 ) = 4
max=4 总和=4
循环 arr[4]=-1: sum = max( 4 + -1, -1) = 3, max = (3,4) = 4
max=4 总和=3
循环arr[5]=2: sum = max( 3 + 2, 2) = 5, max = max(5,4) = 5
所以迭代看起来像这样:
arr [-2, 1, -3, 4, -1, 2, 1, -5, 4] sum x, 1, x, 4, 3, 5, 6, 1, 5 max -2, 1, 1, 4, 4, 5, 6, 6, 6
这就像找到累进和、丢弃负序列或在和为负时开始一个新序列,因为任何负序列都会对序列的总和产生负面影响。
并且,你使用max = Math.max(max, sum),(将max设置为当前最大值或当前总和中较大的那个)来找到累进总和中达到的最大值(即6 ).
这也说明了所有负数的边缘情况,其中最大和将是最大的负数。
const givenArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
const getMax = arr => {
let sum = arr[0]; //-2
let max = arr[0]; //-2
for (let i = 1; i < arr.length; i++) {
sum = Math.max(sum + arr[i], arr[i]);
max = Math.max(max, sum);
console.log(`max=${max}`, `sum=${sum}`);
}
};
getMax(givenArray);