题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解法
本题解法思路较多,但是从简单易理解的角度来看,使用动态规划的方法是较为清晰的一种。掌握理解一种算法的关键是把握算法的核心思想,动态规划算法的核心思想可以总结为:记住已经解决过的子问题的解。
使用动态规划的思想进行求解,关键是构造状态转移方程,以上述问题为例,状态转移方程如下:
dp[i] - 表示到当前位置 i 的最大子序列和(即该连续子序列以dp[i]为最后一个元素)
状态转移方程为:
dp[i] = max(dp[i - 1] + nums[i], nums[i])
初始化:
dp[0] = nums[0]
所以,记录下以当前位置 i 元素为最后一个元素的连续子序列的和,如果之后在此连续序列的基础上继续向后扩展,添加元素 i+1 ,得到的和大于元素 i+1,则向后扩展(连续子序列添加元素);否则以此元素 i+1 作为新的连续子序列的起点。
具体的代码实现如下:
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# curr_num 记录以当前位置元素作为连续序列最后一个元素,该连续子序列的最大和
# max_num 记录该完整数组nums的最大连续子序列的和
curr_sum = max_sum = nums[0]
# start_index和end_index记录连续子序列的起始位置
start_index = end_index = 0
for i in range(1, len(nums)):
if curr_sum < 0:
curr_sum = nums[i]
start_index = i
else:
curr_sum += nums[i]
if curr_sum > max_sum:
max_sum = curr_sum
end_index = i
return max_sum,start_index,end_index