![](/img/trans.png)
[英]How to find the average length of consecutive positive and negative numbers in a list?
[英]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.