# 用动态规划求一个连续数组最大和的时候,是一个dp数组,这个数组里面最大值才是最大和,
# 那么问题是如何根据这个dp最长子数组呢?
# 方法如下:
# 在求得dp的同时记录当前的dp的数组范围
# 如果当前dp是单个元素则要重置索引,
# 如果当前dp是最大值则要把当前索引保存起来为最大长度和最大索引范围,
# 特殊情况是如果当前dp是已经存在的最大值,
# 则需要考虑当前索引范围是否大于最大索引范围,如果是则更新

class Solution:
    def FindGreatestSumOfSubArray(self , array: List[int]) -> List[int]:
        # write code here
        dp = [i for i in array]#初始化一个和原数组一样大的dp数组
        maxLen = 1 #最小数组长度为1
        start,end = 0,1 
        max_start,max_end = 0,1 
        maxSum = dp[0] 
        for i in range(1,len(array)):
                end +=1
                dp[i] = max(dp[i-1]+array[i], array[i])
                if dp[i-1]+array[i] < array[i]:
                        start,end = i,i+1
                if dp[i] > maxSum or (dp[i] == maxSum and (end - start ) > maxLen):
                        max_start = start
                        max_end = end
                        maxLen = end - start
                        maxSum = dp[i]
        return array[max_start:max_end]

空间优化:
由于只需要用到dp的前一个值和当前值,所以设置2个变量就可以代替整个dp数组了。
class Solution:
    def FindGreatestSumOfSubArray(self , array: List[int]) -> List[int]:
        # write code here
        # dp = [i for i in array]#初始化一个和原数组一样大的dp数组
        preval,curval = array[0],array[0]
        maxLen = 1 #最小数组长度为1
        start,end = 0,1 
        max_start,max_end = 0,1 
        maxSum = curval 
        for i in range(1,len(array)):
                end +=1
                curval = max(preval+array[i], array[i])
                if preval+array[i] < array[i]:
                        start,end = i,i+1
                if curval > maxSum or (curval == maxSum and (end - start ) > maxLen):
                        max_start = start
                        max_end = end
                        maxLen = end - start
                        maxSum = curval
                preval = curval
        return array[max_start:max_end]