题目:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
思路:
因为要考虑连续,所以需注意两点,与当前比较的必定包含当前节点的上一个节点,前n个节点的最大字串不一定包含n,但是与n+1进行计算的字串必须包含n
1.当数组存在整数时,其最大值应为正数最多时,都为负数时,其最大值为最大的负数
以此思路进行设计,采用变量res存储当前遍历数列后的最大值,变量sumN存储当前数列的相加之和,当sumN为负值时,后续值与其相加必变小,所以令其为0.
2.动态规划,f[n] = max(f[n-1]+A[n],A[n])
思路1
def maxSubArray(self, nums: List[int]) -> int:
res = nums[0]
sumN = 0
for i in nums:
if sumN > 0:
sumN += i
else:
sumN = i
res = max(res,sumN)
return res
思路2 数组中第i个节点存储前i个序列中和结尾到i的最大值,整个数组的最大值为。因为要求连续子序列,所以要求结尾到i
def maxSubArray(self, nums: List[int]) -> int:
res = nums[0]
sumN = 0
for i in nums:
sumN = max(sumN+i,i)
res = max(res,sumN)
return res
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1,len(nums)):
nums[i] = max(nums[i-1] + nums[i],nums[i])
return max(nums)