如何找到n个正数和负数序列的连续项的最大和?

时间:2016-10-30 14:49:25

标签: python divide-and-conquer

我试图通过分成两半并找到每个中的最大总和来解决这个问题。我用了MegaSort。但我坚持如何记录并返回每个递归函数的最大总和。 例如,

[1,-3,4,-7,8] - >最大的总和应该是8.(自身总和)

[5,5,-3,6,-10] - >最大的和应为5 + 5 +( - 3)+ 6 = 13

[3,-9,10,5] - >最大的总和是10 + 5 = 15

 def find_max(seq):
     if len(seq) == 1:
        if(seq[0] > sum):
           sum = seq[0]
        return seq
     else:
        mid = len(seq)//2
        left = [:seq]
        right = [seq:]
        find_max(left)
        find_max(right)

2 个答案:

答案 0 :(得分:1)

我不确定这个答案会有什么帮助,因为我理解你的问题不是关于算法本身,而是关于如何用Python实现它(我不知道Python)。但是你可以使用另一种算法,也许你可以在不需要任何帮助的情况下实现。请注意,此算法仅计算总和,而不是计算总和的序列(据我所知,这是您想要的)。这是类似C的伪代码解决方案:

int findMax(sequence, length) {

    int maxSumStartingAt[length]; 
    maxSumStartingAt[length - 1] = sequence[length-1];

    for(int i=length-2; i >= 0; i--) {
        int tempSum = sequence[i] + maxSumStartingAt[i+1];
        if ( sequence[i] > tempSum ) {
            maxSumStartingAt[i] = sequence[i];
        } else {
            maxSumStartingAt[i] = tempSum;
        }
   }

   int maxSum = maxSumStartingAt[0];
   for(int i = 1; i < length; i++) {
       if ( maxSum < maxSumStartingAt[i] ) {
           maxSum = maxSumStartingAt[i];
       }   
   }

   return maxSum;
}

现在我将向您解释此解决方案的工作原理。

1)由于产生最大和的子序列必须从某个索引i开始,因此想法是为每个索引i计算从i开始的连续元素的最大和。结果是这些总和之间的最大值。

2)现在,如果有人告诉你,产生最大和的元素的子序列开始于索引i,并且从索引i + 1开始的子序列的连续元素的最大总和是x,你怎么能计算想要的总和?它只是

之间的最大值
sequence[i]

sequence[i] + x

我们可以使用这些信息来计算从索引i开始的每个索引i的最大总和:我们从序列的最后一个元素开始,又名

sequence[length-1] 

如果我们从0开始索引。从这个索引开始的最大总和是多少,我称之为maxSumStartingAt [length-1]?

可能就是其中之一
sequence[length - 1] 

本身,因为这是一个单元素序列。什么是从索引长度开始的最大总和 - 2?这是

之间的最大值
sequence[length-2] 

sequence[length-2] + maxSumStartingAt[length-1]

从索引长度开始的最大总和是3?再次,它是

之间的最大值
sequence[length-3]

sequence[length-3] + maxSumStartingAt[length-2]

我们可以将这个公式应用于序列的每个索引,最终我们得到索引0,并且我们从每个索引的通用索引i开始有最大的和。这正是解决方案中第一个for循环所做的事情。此时,我们所要做的就是找到所有计算总和之间的最大值(这是解决方案中第二个for循环)。这是最大值。

关于您的解决方案的一点说明。鉴于我不知道Python所以我无法判断你发布的代码,如果它完全符合你在问题中所说的那样(即将序列分成两半并计算每一半的最大总和,然后返回最大值)在这两个值之间)它不起作用,因为它不包括跨越两半的序列产生最大总和的情况。

答案 1 :(得分:0)

def largestSum(arr):
  curr = arr[0]
  lsum = arr[0]

  if len(arr) <= 1:
    return arr

  for i in range(1, len(arr)):
    curr = max(arr[i], curr + arr[i])

    if curr > lsum:
      lsum = curr
  return lsum

largestSum([-2,3,2,-1])