题目:输入一个整型数组,数组里面有正数也有负数,数组中连续的一个或多个整数组成子数组,每个子数组都有一个和。求所有子数组的和的最大值。
例如,输入的数字为:1,-2,3,10,-4,7,2,-5,则和最大的子数组为3,10,-4,7,2和为18。
使用动态规划思想:
初始值为0;
公式为
S(n) = max( S(n-1) , 0 ) + array[n]
S(n) 表示以第n位为结束位的最大子序列和
以此公式可以得到以每一个索引为 结束位的子数组的最大和;
以一个辅助数组记录每一个索引对应的S(n) ,找出其中的最大值即为该数组的最大子序和。
public class Demo02 {
public static void main(String[] args) {
int a[] = new int[]{1,-2,3,10,-4,7,2,-5};
System.out.println(maxSubArray(a));
}
public static int maxSubArray(int a[]){
if(a == null || a.length == 0){
System.out.println("无最大子序和");
return 0;
}
//dp[i],记录以第i位为结束位的最大子序列和
int[] dp = new int[a.length];
int result = dp[0];
dp[0] = a[0];
for(int i = 1;i < a.length ; i++){
//dp[i-1],记录以第i-1位为结束位的最大子序列和
//则dp[i]就等于max(dp[i-1],0) +a[i]
dp[i] = max(dp[i-1],0) +a[i];
result = max(result,dp[i]);
}
return result;
}
public static int max(int a,int b){
return a>b? a:b;
}
}
时间复杂度:O(n)
空间复杂度:O(n) ,创建了一个数组记录,记录以第i位为结束位的最大子序列和。