【问题标题】:How to find the largest sum of consecutive terms of sequence of n positive and negative numbers?如何找到n个正负数序列的最大连续项和?
【发布时间】:2017-03-12 20:02:03
【问题描述】:

我试图通过分成两半并找到每个中最大的和来解决这个问题。我使用了 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)

【问题讨论】:

  • 我只了解您的代码有问题。但是你想达到什么目的?请提供输入序列和所需的输出。谢谢。

标签: python divide-and-conquer


【解决方案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] 

本身,因为这是一个 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,所以我无法判断您发布的代码,如果它完全符合您在问题中所说的(即将序列分成两半并计算每半的最大总和,然后返回最大值在这两个值之间)它不起作用,因为它不涵盖最大和由跨越两半的序列产生的情况。

【讨论】:

    【解决方案2】:
    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])
    

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 2011-10-03
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多