问题描述
给定一个数组,找出其中最大的连续子数组的和
如[5,-7,3,-2,6]最长的连续子数组为[3,-2,6],和为7
问题分析
令sum[i]表示以第i个元素结尾的最大连续子数组和,maxSum表示最大连续子数组的和
递推公式
sum[i] = max(sum[i-1]+array[i],array[i])
maxSum = max(maxSum,sum[i])
进一步地约减,我们发现没有必要用数组sum来保存每一个元素结尾的子数组的和,我们只需要上一个元素为结尾的元素和即可
将数组sum变为变量sum
递推公式
sum = max(sum+array[i],array[i])
maxSum = max(maxSum,sum)
代码
/**
* Created by Jason on 2016/4/16.
*/
public class MaxSubArraySum {
public static int getMaxSum(int... array) {
int length = array.length;
if (length==0) {
return 0;
} else {
int sum = array[0], maxValue = array[0];
for (int i=1;i<length;i++) {
sum = Math.max(sum+array[i],array[i]);
maxValue = Math.max(maxValue,sum);
}
return maxValue;
}
}
public static void main(String[] args) {
int[] array = new int[]{5,-7,3,-2,6};
System.out.println(getMaxSum(array));
}
}
代码链接https://github.com/lincolnmi/algorithms/blob/master/src/DP/MaxSubSequenceSum/MaxSubArraySum.java