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 

 

posted @ 2019-05-09 19:19  三年一梦  阅读(200)  评论(0)    收藏  举报