连续子数组的最大和

时间:2021-10-10
本文章向大家介绍连续子数组的最大和,主要包括连续子数组的最大和使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

连续子数组的最大和

问题描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

示例:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6

分析问题

因为题目是求所有子数组的和的最大值,我们可以假设以第i个数结尾的连续子数组和的最大的值为f(i)。现在我们只需要求出所有的f(i),拿出其中最大的就是题目的解。

我们下面来看一下如何求解f(i)。对于以第i个数结尾的子数组来说,f(i)要么等于nums[i],要么等于f(i-1)+nums[i],这取决于nums[i]和f(i-1)+nums[i]的大小。即f(i)=max(nums[i],f(i-1)+nums[i])

class Solution:
    def FindGreatestSumOfSubArray(self, array):
        if array is None or len(array)==0:
           return 0
        n=len(array)
        dp=[0]*n
        dp[0]=array[0]
        for i in range(1,n):
            dp[i]=max(array[i],dp[i-1]+array[i])
        return max(dp)

我们可以看到这里的时间复杂度和空间复杂度都是O(n)。由于我们在求解f(i)的时候,只和f(i-1)和nums[i]有关,而和f(i-2)、f(i-3)...无关,所以,我们只需要一个变量去保存f(i-1)就好了,这样可以把空间复杂度减低为O(1)。下面我们来看一下代码如何实现。

def maxSubArray(array):
    if array is None or len(array)==0:
        return 0
    n=len(array)
    pre=array[0]
    result=array[0]
    for i in range(1,n):
        pre=max(array[i],pre+array[i])
        result=max(result,pre)
    return result

原文地址:https://www.cnblogs.com/cxyxz/p/15388805.html