题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n) 。
例如,输入的数组为 {1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为 {3, 10, -4, 7, 2},因此输出为该子数组的和为 18.
最开始的思考是分四种情况(f 表示的也是数组,f[i]表示取到当前位置 i 时的连续子数组的最大和):
- f[i-1]:为正,data[i]:为正,f[i] = f[i-1]+data[i]
- f[i-1]:为负,data[i]:为正,f[i] = data[i]
- f[i-1]:为正,data[i]:为负,f[i] = f[i-1]+data[i]
- f[i-1]:为负,data[i]:为负,f[i] = data[i]
所以,其实 f[i] 与 data[i] 的取值无关,仅与 f[i-1]的取值有关;
def sis_sum(seq):
l = len(seq)
f = [0]*l
for i in range(l):
if i == 0 or f[i-1] <= 0:
f[i] = seq[i]
if f[i-1] > 0:
f[i] = f[i-1] + seq[i]
return max(f)