问题描述:
给定一个整数序列,a0, a1, a2, …… , an(项可以为负数),求其中最大的子序列和。如果所有整数都是负数,那么最大子序列和为0;
解决这个问题的算法有很多种,比如两重循环的暴力破解,或者利用分治的思想,但是还有一种线性时间复杂度的算法:在线处理,可以比较好的解决这个问题。注释在代码中。
public class MaxSum {
//算法:在线处理
public static int maxSum(int[] a) {
int sum=0;
int lastSum=0;
for(int i=0;i<a.length;i++) {
lastSum+=a[i];
//如果比sum大,则更新最大值
if(lastSum>sum) {
sum=lastSum;
}
//这里是关键,如果当前和为负数,在不可能为后面的和做出贡献,只能使后面的和变小
//所以丢弃它
else if(lastSum<0){
lastSum=0;
}
}
return sum;
}
public static void main(String[] args) {
int[] a={4,-3,5,-2,-1,2,6,-2};
System.out.println(maxSum(a));
}
}