问题描述
分析
我们可以采用动态规划(dp)来解决这道题。
- 问题:求所有子数组的最大值(连续整数)
- 状态:F[i]以第i个元素结尾的最大连续子序列和
- 转移方程:F[i]=max(F([i-1]+A[i],A[i])
- 初始状态:F[0]=A[0]
- 返回值:F[i]
注意:因为题目中是一个或连续多个整数组成一个子数组,所以状态一定要设置为以第i个元素结尾的最大连续子序列和才可以。然后转移方程的话,F[i]需要与取F[i-1]+A[i]和A[i]的最大值才行,如果加上A[i]比原来大则将其加入序列,否则舍弃。
下面结合图来理解
例如[-2,1,-3,4,-1,2,1,-5,4]
AC代码
class Solution {
public int maxSubArray(int[] array) {
if(array==null)
{
return -1;
}
//保存第一个数(初态)
int ret=array[0];
for(int i=1;i<array.length;i++)
{
array[i]=Math.max(array[i-1]+array[i],array[i]);
//将上一次的值与这一次作比较
ret=Math.max(ret,array[i]);
}
return ret;
}
}