题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
解题思路
动态规划。对于数组
n
u
m
s
nums
nums,使用
d
p
[
i
]
dp[i]
dp[i] 表示以第
i
i
i 各数为结尾的连续子数组的最大和,那么,显然我们要求的答案就是
m
a
x
{
d
p
(
i
)
}
,
0
≤
i
≤
n
−
1
max\{dp(i)\},~0\leq i \leq n-1
max{dp(i)}, 0≤i≤n−1。
状态转移方程为:
d
p
[
i
]
=
m
a
x
{
d
p
[
i
−
1
]
+
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
}
dp[i] = max\{dp[i-1]+nums[i],nums[i]\}
dp[i]=max{dp[i−1]+nums[i],nums[i]}
由于如果使用长度为n的数组来储存
d
p
[
i
]
dp[i]
dp[i]的值,空间复杂度为
O
(
n
)
O(n)
O(n),只用一个变量
d
p
dp
dp 来维护对于当前的
d
p
[
i
]
dp[i]
dp[i]的
d
p
[
i
−
1
]
dp[i-1]
dp[i−1] 的值是多少,空间复杂度会降为
O
(
1
)
O(1)
O(1).
代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
dp = 0
res = nums[0]
for i in range(n):
dp = max(dp + nums[i], nums[i])
res = max(res, dp)
return res
复杂度
- 时间复杂度 O ( n ) O(n) O(n);
- 空间复杂度 O ( 1 ) O(1) O(1)。