/**
* 题目:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。
* 但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?
* 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。
* 给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
* @author hexiaoli
* 思路:
* 1)采用动态规划思想,如果当前和小于0且加入第i个值的和没有第i个值大,则当前和设为第i个值
* 如果当前和大于0,则加入第i个值。
*/
public class Main{
public static int indGreatestSumOfSubArray(int[] array) {
//边界情况
if(!isValidArray(array)) {
return 0;
}
//最大连续子序列的和和当前和
int GreatestSum = Integer.MIN_VALUE;
int currentSum = 0;
for (int i = 0; i < array.length; i++) {
if(currentSum <=0 ) {
//如果当前和小于0且加入第i个值的和没有第i个值大,则当前和设为第i个值
currentSum = array[i];
}else {
//如果当前和大于0,则加入第i个值
currentSum+=array[i];
}
//更新最大值
if(currentSum>GreatestSum) {
GreatestSum = currentSum;
}
}
return GreatestSum;
}
public static boolean isValidArray(int[] array) {
boolean validFlag = true;
if(array == null || array.length == 0) {
validFlag = false;
}
return validFlag;
}
public static void main(String[] args) {
int[] array= {1,-2,4,-5,7,9};
System.out.println(indGreatestSumOfSubArray(array));
}
}