方法一
通过连个变量分别记录遍历到当前元素的最大值及整个数组的最大值
- 数组可能为全是负数,最小的元素在数组中间
我的解法
class Solution:
def maxSubArray(self, nums) -> int:
temp_sum = 0
max_sum = nums[0]
for i in nums:
if temp_sum + i > 0:
temp_sum += i
else:
temp_sum = 0
if temp_sum > max_sum and (temp_sum > 0): #temp_sum ==0 表示遇到了负数,max_sum不能随temp_sum更新为0
max_sum = temp_sum
return max_sum if max_sum > 0 else max(nums)# 包含数组全为负的情况
[参考解答]
class Solution:
def maxSubArray(self, nums) -> int:
res = float('-inf')#res 保存到目前为止最大的和
temp_sum = 0 # 临时的和
for i in nums:
temp_sum += i# temp_sum >= i,负数的情况也包含在内
if (temp_sum > res):
res = temp_sum#
if (temp_sum < 0):
temp_sum = 0
return res
方法二 动态规划
动态规划
class Solution:
def maxSubArray(self, nums) -> int:
dp = [float('-inf') for i in range(len(nums))]
dp[0] = nums[0]
for i in range(len(nums))[1:]:
if dp[i - 1] > 0:
dp[i] = dp[i - 1] + nums[i]
else:
dp[i] = nums[i]
return max(dp)
参考答案
在原数组上修改,没有另开空间
大神的写的好简洁
class Solution:
def maxSubArray(self, nums) -> int:
for i in range(1, len(nums)):
nums[i] += max(nums[i - 1], 0)
return max(nums)
转移方程
dp[i] = dp[i - 1] + nums[i](dp[i-1]>0)
dp[i] = nums[i](dp[i-1]<=0)