剑指Offer 42.连续子数组的最大和
输入一个整型数组,数组里有整数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的个的最大值。
示例:
输入的数组为{1,-2,3,10,-4,7,2,-5},
其最大子数组{3,10,-4,7,2},
输入为该子数组的和18。
LeetCode 53.最大子序和
两题表述不一样,实际上是同一个题。
解题思路
动态规划
如果用函数
f
(
i
)
f(i)
f(i)表示以第
i
i
i个数字结尾的子数组的最大和,那么我们只需要求出
m
a
x
(
f
(
i
)
)
max(f(i))
max(f(i))。
其状态方程可以表示为:
f
(
i
)
=
m
a
x
(
f
(
i
−
1
)
+
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
)
f(i)=max(f(i-1)+nums[i],nums[i])
f(i)=max(f(i−1)+nums[i],nums[i]).
结合例子来进行说明:
输入数组为{1,-2,3,10,-4,7,2,-5},
我们用列表res来存储结果,每个元素表示以这个元素结尾的子数组的最大和。
对于元素1,最大子数组为[1],res为[1];
对于元素-2,最大子数组为[1,-2],res为[1,-1];
对于元素3,最大子数组为[3],res为[1,-1,3];
对于元素10,最大子数组为[3,10],res为[1,-1,3,13];
对于元素-4,最大子数组为[3,10,-4],res为[1,-1,3,13,9];
对于元素7,最大子数组为[3,10,-4,7],res为[1,-1,3,13,9,16];
对于元素2,最大子数组为[3,10,-4,7,2],res为[1,-1,3,13,9,16,18];
对于元素5,最大子数组为[3,10,-4,7,2,-5],res为[1,-1,3,13,9,16,18,13];
最后返回res中最大的元素18,最大子数组为[3,10,-4,7,2]
时间复杂度 O ( n ) O(n) O(n)。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums: return 0
res = [nums[0]]
for i in range(1,len(nums)):
res.append(max(res[i-1] + nums[i],nums[i]))
return max(res)