53. Maximum Subarray 最大子序列和
1. 原始题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
2. 思路
考虑第i个位置的元素。如果i个元素之前的和+第i个位置的元素<第i个位置的元素大小,那么前面的序列都可以舍掉。否则将第i个元素加进来。
eg:考虑[1, -2,3]这个子序列:
1 和为1
1 -2 和为-1>-2,所以将-2纳入
1 -2 3和为2,小于3,所以之前的序列都舍掉。将3作为新的子序列。
....
3. 解法
1 class Solution:
2 def maxSubArray(self, nums: List[int]) -> int:
3 if len(nums)<2:return sum(nums)
4 res = nums[0] # 最终的子序列和的最大值
5 temp = [nums[0]] # 最初的子序列为第一个元素
6 for i in range(1,len(nums)):
7 if nums[i]+sum(temp)<nums[i]: # 关键:如果之前的元素加上当前的元素还比当前的元素小
8 temp = [nums[i]] # 那子序列更新为当前的元素,之前的序列都不要了
9 res = max(res,nums[i]) # 结果选择最大的
10 else:
11 temp.append(nums[i]) # 否则加上,因为还有可能出新更大的元素
12 res=max(res,sum(temp)) # 选择最大的
13
14 return res

改进:
第一点:
两个max操作可以合并到条件语句之后,子序列不必显示的添加,因为题目没有要求返回子序列,只是和而已。所以不需要开辟空间存放子序列。还有语句:
nums[i]+sum(temp)<nums[i]
可以改写为:
sum(temp)<0
改进之后:
1 class Solution:
2 def maxSubArray(self, nums: List[int]) -> int:
3 if len(nums)<2:return sum(nums)
4 res = nums[0]
5 temp = nums[0]
6 for i in range(1,len(nums)):
7 if temp<0:
8 temp = nums[i]
9 else:
10 temp+=nums[i]
11 res=max(res,temp)
12
13 return res


浙公网安备 33010602011771号