题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。分析
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
这道题是动态规划的简单题,要求数组中连续子序列的和最大值。
直接给出状态转移方程:
对于第i个元素:
s
u
m
[
i
]
=
m
a
x
{
s
u
m
[
i
−
1
]
+
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
}
sum[i] = max \lbrace{ sum[i - 1] + nums[i], nums[i] \rbrace}
sum[i]=max{sum[i−1]+nums[i],nums[i]}
或者
s
u
m
[
i
]
{
s
u
m
[
i
−
1
]
+
n
u
m
s
[
i
]
,
if sum[i-1]
>
0
n
u
m
s
[
i
]
,
if sum[i-1]
≤
0
sum[i] \begin{cases} sum[i-1]+nums[i], & \text {if sum[i-1]}>0 \\ nums[i], & \text{if sum[i-1]} \leq0\end{cases}
sum[i]{sum[i−1]+nums[i],nums[i],if sum[i-1]>0if sum[i-1]≤0
代码
public int maxSubArray(int[] nums) {
int max = nums[0];
int len = nums.length;
int[] dp = new int[len];
dp[0] = nums[0];
for(int i = 1; i < nums.length; i++) {
if(dp[i - 1] >= 0)
dp[i] = dp[i - 1] + nums[i];
else
dp[i] = nums[i];
if(dp[i] > max)
max = dp[i];
}
return max;
}