最大子列和问题描述:
给定一串整数列中,求满足子列和最大,并返回最大值。例如(2, -1, 6, 8, -5, 7, -11),其中的满足和最大的子列为(2, -1, 6, 8, -5, 7),最大值为17。
算法一
最蠢的方法是枚举法,把所有的子列都跑一遍。
int max_len(int a[], int N){
int i, j, k, thisSum, maxSum = 0;
for(i=0; i
for(j=i; j
thisSum = 0;
for(k=i; k<=j; k++)
thisSum += a[k];
if(thisSum > maxSum)
maxSum = thisSum;
}
}
return maxSum;
}
复杂度为O(n^3),效率很低。
算法二
算法一中对j的循环是每次自加1,此时i是不变的,而k循环的作用是累加从i到j的子列长度,可见虽然每次只需要再计算一个int值,但是k循环依然从最开始累加,没有必要,所以k循环这里可以优化。
int max_len(int a[], int N){
int i, j, k, thisSum, maxSum = 0;
for(i=0; i
thisSum = 0;
for(j=i; j
thisSum += a[j]; //