53. 最大子序和
Tg:动规
第一次做法:对于从i开始的最大子序和,要么是nums[i]加上从i+1开始的最大子序和,要么是nums[i]自己(i+1的最大子序和小于等于0),故考虑从右侧往左侧遍历,算出最大子序和即可。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
l=len(nums)
dp=nums[:]
res=dp[-1]
for i in range(l-2,-1,-1):
dp[i]=max(dp[i],dp[i]+dp[i+1])
res=max(dp[i],res)
#dp[i]表示从i开始的最大子序和
return res
评论区的:从头开始遍历,sum记录当前的子序和,若sum<0说明该段一定不需要,即结果最大子序和中一定不需要这一段小于0的(反证法易证),更新sum为当前元素,继续向后。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
l=len(nums)
if not l:
return 0
sum=nums[0]
res=nums[0]
for i in range(1,l):
if sum<0:
sum=0
sum+=nums[i]
res=max(res,sum)
return res
效率差不多,都是O(N)
进击的小🐴农