求连续子串的和的最大值
题目描述:在长度为N的整形数组中,求连续子串的和的最大值,要求复杂度为O(N)。
例如:1 2 3 -1 -20 100 34,结果为134。
经典的动态规划:
j
思路:第一个值不为负,如果为负则更新。
def maxsub(alist):
if len(alist)=0:
return 0
#定义一个局部变量,local
local=0
#定义一个全局最大变量
global =alist[0]
for i in range(len(alist)):
if local < 0:
local=alist[i]
else:
locla+=alist[i]
#得到局部最大值和全局最大值比较
global = max(local,global)
解法二:
设dp[i]是以alist[i]为末端的连续最大子数组之和
则dp[i]=max{di[i-1] + a[i]},a[i]}
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp=[0]*len(nums)
dp[0]=nums[0]
for i in range(1,len(nums)):
dp[i]=max(nums[i],nums[i]+dp[i-1])
return max(dp)
法三:
当 dp[i - 1] > 0,dp[i−1]>0 时:dp[i] = dp[i-1] + nums[i] ;
当 dp[i - 1] <= 0,dp[i−1]≤0 时: dp[i] = nums[i] ;
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
nums[i] += max(nums[i - 1], 0)
return max(nums)