注意
可以使用以下测试案例来检验:
[0,0,0,1,1,-51,0,0,1,1]
正确答案应该是 [0,0,0,1,1],但是其他方法结果都是[0,0,1,1]
v1 – dp
本解法比较易懂,但是内存速度开销会稍微大一点。 但是目前看下来,只有本解法才是正确的。
分析
该题目与之前做过的连续子序列最大和很相似,唯一的区别是需要返回子序列是什么
这样只需要新增两个参数来记录子序列的起始即可
然而,题目给定了一种特殊情况,就是
如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个
由于增加了这个约束,使得我们不得不记录当前最长的序列长度是多少。下面看看我们在代码中如何处理
class Solution:
def FindGreatestSumOfSubArray(self , array: List[int]) -> List[int]:
maxSum, nSum, sBegin, sEnd, nBegin, nEnd = -1000, -100, 1, 1, 1,1
for i in range(len(array)):
if nSum >= 0:
nSum = nSum + array[i]
if nSum >= maxSum:
maxSum = nSum
nEnd = i
if sEnd-sBegin <= nEnd-nBegin:
sBegin, sEnd = nBegin, nEnd
elif nSum < 0:
nSum = array[i]
nBegin, nEnd = i, i
if nSum > maxSum:
maxSum = nSum
sBegin, sEnd = nBegin, nEnd
return array[sBegin:sEnd+1]
v2(AC, but error)
最常见的解法,只考虑尽可能大,但是没有考虑相同值,但是长度不一的情况;若遇到和相同,则只会选择相对位置靠后的子序列。
class Solution:
def FindGreatestSumOfSubArray(self , array: List[int]) -> List[int]:
maxval = array[0]
temp = array[0]
endindex = 1
beginindex = 0
for i in range(1, len(array)):
if temp < 0:
temp = array[i]
beginindex = i
else:
temp += array[i]
if temp >= maxval:
endindex = i
maxval = temp
if beginindex > endindex:
return array[endindex:endindex + 1]
return array[beginindex:endindex + 1]