Javascript 卡丹';s算法没有返回最大连续和的正确值?

Javascript 卡丹';s算法没有返回最大连续和的正确值?,javascript,arrays,algorithm,math,kadanes-algorithm,Javascript,Arrays,Algorithm,Math,Kadanes Algorithm,尝试使用Kadane的算法,如下所述: 在这个数字数组上:[-5,10,2,-3,5,8,-20] 答案是10+2–3+5+8=22 但是,当我运行以下代码时,我得到以下结果: sumArray=[0,20,24,24,28,44,44] 不知道24和更高的数字是如何进入的:(而且22丢失了 代码如下: const myArray = [-5, 10, 2, -3, 5, 8, -20]; const findMaxConsecutiveSum = (arr) => { const

尝试使用Kadane的算法,如下所述:

在这个数字数组上:
[-5,10,2,-3,5,8,-20]

答案是
10+2–3+5+8=22


但是,当我运行以下代码时,我得到以下结果:

sumArray=[0,20,24,24,28,44,44]

不知道
24
和更高的数字是如何进入的:(而且
22
丢失了

代码如下:

const myArray = [-5, 10, 2, -3, 5, 8, -20];

const findMaxConsecutiveSum = (arr) => {
  const sumArray = [];
  let max_so_far = 0;
  let max_ending_here = 0;

  for (let i = 0; i < arr.length; i++) {
    max_ending_here = max_ending_here + arr[i];
    // console.log('position:', i, arr[i]);
    // console.log(max_ending_here = max_ending_here + arr[i]);
    // console.log('max_ending_here', max_ending_here);

    if (max_ending_here < 0) {
      max_ending_here = 0;
    }
    else if (max_so_far < max_ending_here) {
      max_so_far = max_ending_here;
    }

    // console.log('max_so_far', max_so_far);
    sumArray.push(max_so_far);
  }

  return sumArray;
}

console.log(findMaxConsecutiveSum(myArray));
constmyarray=[-5,10,2,-3,5,8,-20];
常量findMaxConcertivesum=(arr)=>{
常量数组=[];
设max_so_far=0;
让这里的max_end_=0;
for(设i=0;i
我的想法是,我只需填充数组,然后按最大的数字进行过滤。 然而,我没有得到
22
,而是得到了大量更大的数字


你知道为什么吗?

你让实现变得比需要的复杂得多。从文章开始,代码应该如下所示:

def max_subarray(A):
    max_ending_here = max_so_far = A[0]
    for x in A[1:]:
        max_ending_here = max(x, max_ending_here + x)
        max_so_far = max(max_so_far, max_ending_here)
    return max_so_far
上面提到的算法需要返回一个数字,而不是一个数组。转换为JS,如下所示:

constmyarray=[-5,10,2,-3,5,8,-20];
常量findMaxConcertivesum=(arr)=>{
设max_so_far=0;
让这里的max_end_=0;
for(设i=0;iconsole.log(FindMaxConcertivesum(myArray));
您使实现变得比需要的复杂得多。从文章开始,代码应该如下所示:

def max_subarray(A):
    max_ending_here = max_so_far = A[0]
    for x in A[1:]:
        max_ending_here = max(x, max_ending_here + x)
        max_so_far = max(max_so_far, max_ending_here)
    return max_so_far
上面提到的算法需要返回一个数字,而不是一个数组。转换为JS,如下所示:

constmyarray=[-5,10,2,-3,5,8,-20];
常量findMaxConcertivesum=(arr)=>{
设max_so_far=0;
让这里的max_end_=0;
for(设i=0;iconsole.log(FindMaxConcertivesum(myArray));
根据我对Kadane算法的理解(从本文),实现它的方法如下:

constmyarray=[-5,10,2,-3,5,8,-20];
log(myArray.reduce((t,v)=>{t.here=Math.max(v,v+t.here);
t、 max=Math.max(t.max,t.here);
返回t;},

{here:0,max:0}][max'];
根据我对Kadane算法的理解(从这篇文章),实现它的方法如下:

constmyarray=[-5,10,2,-3,5,8,-20];
log(myArray.reduce((t,v)=>{t.here=Math.max(v,v+t.here);
t、 max=Math.max(t.max,t.here);
返回t;},

{here:0,max:0}][max'];
谢谢,我缺少的部分是
Math.max
谢谢,我缺少的部分是
Math.max
谢谢!我知道有一种方法可以使用
reduce
来做:)谢谢!我知道有一种方法可以使用
reduce
来做到这一点:)