小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
连续子数组的最大和
问题描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为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