簡體   English   中英

如何找到n個正負數序列的連續項的最大和?

[英]How to find the largest sum of consecutive terms of sequence of n positive and negative numbers?

我試圖通過分成兩半並在每個中找到最大的總和來解決此問題。 我用了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(而且我不知道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,所以我無法判斷您發布的代碼,如果它確實符合您在問題中所說的(即,將序列分成兩半並計算每半的最大和,然后返回最大在這兩個值之間)無效,因為它不涵蓋跨兩個半部的序列產生最大和的情況。

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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM