题目描述:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6],a[7])=(1,-2,11,-4,8,-5,-2)时,最大子段和为15。
public class Test {
public static int GreatestSum(int[] array) {
if (array.length==0 || array==null) {
return 0;
}
int currentSum = 0;
int max = 0;
for (int i = 0; i < array.length; i++) {
if(currentSum<=0){
currentSum = array[i];
}else{
currentSum += array[i];
}
if(currentSum>max){
max = currentSum;
}
}
return max;
}
}
设置一个最大值,一个临时的最大值。 这里的currentSum理解为上一次的最大值,初始的时候认为最大值为0,有可能数组为全负数。 第一次进入开始分两种情况, 1.第一个数为小于等于零的数,现在最大值为0,下一次循环就会把下一个数设为当前最大值。 2.第一个数为大于零的数,最大值比零大,赋值给max。(有种在林子里找最好看的鸟,看到暂时最好看的设为最大值,直到遇到更好看的,就把它取代)