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