方法一:前缀和
python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return nums[0]
ans = float('-inf')
# 前缀和或前缀最小值取0,因为这样遇到第一个元素会变成第一个元素
min_num = pre = 0
for i, num in enumerate(nums):
pre += num
# 如何计算出准确的最大子数组和
# 用当前的前缀和减去该元素之前,前缀和的最小值
# 所以要维护前缀和的最小值
# 要取之前的最大值或者当前的最大值
ans = max(pre - min_num, ans)
min_num = min(min_num,pre)
return ans
方法二:动态规划
python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
f = [0]*n
# f的第一个元素没有计算,要与nums的第一个元素相同
f[0] = nums[0]
for i in range(1,n):
f[i] = max(f[i-1],0) +nums[i]
return max(f)
python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
ans = -inf
# f可以初始化为0或任意负数
# 上个方法中只有发f[i-1]对f[i]的值有影响,可以进行简化
f = 0
# 循环范围的取值也有区别
for i in range(0,n):
f = max(f,0) +nums[i]
# 取当前值或者上次计算出的最大值
ans = max(ans,f)
return ans