题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)O(n)。
例如,输入的数组为 {1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为 {3, 10, -4, 7, 2},因此输出为该子数组的和为 18.
F(i):以arr[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变
F(i)=max(F(i-1)+arr[i] , arr[i])
代码1 暴力求解
arr = [1, -2, 3, 10, -4, 7, 2, -5]
# 暴力求解
maxsum = 0
for i in range(len(arr)):
cursum = 0
for j in range(i, len(arr)):
cursum += arr[j]
if cursum > maxsum:
maxsum = cursum
print(maxsum)
代码2 动态规划 针对这个问题,递推公式是DP[i] = max{DP[i-1] + A[i],A[i]};既然转移方程出来了,意味着写一层循环就可以解决这个问题。
# 动态规划 1
cursum, maxsum = 0, 0
for i in range(len(arr)):
if arr[i] > arr[i] + cursum: # 此时cursum<0
cursum = arr[i]
else:
cursum = arr[i] + cursum
if cursum > maxsum:
maxsum = cursum
print(maxsum)
# 动态规划 2
cursum, maxsum = 0, 0
for i in range(len(arr)):
cursum += arr[i]
if cursum > maxsum:
maxsum = cursum
if cursum < 0:
cursum = 0
print(maxsum)
# 动态规划 3
cursum, maxsum = 0, 0
for i in range(len(arr)):
cursum = max(arr[i], arr[i] + cursum)
maxsum = max(maxsum, cursum)
print(maxsum)