=====
题目描述如下:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
=====
算法思路:
我们取某个元素 i 为某个子数组的右端点。找出所有以元素i为右端点的子数组,并计算出这些数组的最大和,我们设以元素i为右端点的最大和为maxSum[i]。那么我们可以发现以下的递推公式:
当maxSum[i]大于0时,maxSum[i+1] = maxSum[i]+nums[i+1]
当maxSum[i]小于等于0时,maxSum[i+1] = nums[i+1]
因此我们从左往右遍历一遍数组即可找出所有的maxSum[i]。我们取其中的最大值即为最终答案。
代码实现时,我们可以仅设一个整数变量curMaxSum即可,无需设maxSum数组。同时我们设另一个整数变量res来维护遍历中的最大值。最后返回最大值res。
时间复杂度为O(n)。下面是Python代码实现:
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
curMaxSum=nums[0]
res=curMaxSum
n=len(nums)
for i in range(1, n):
curMaxSum=nums[i]+curMaxSum if curMaxSum > 0 else nums[i]
res=max(res, curMaxSum)
return res
关键词: 动态规划