public class MaxSum {
/*
分治思想,分别计算左半边的最大子序列和,右半边的最大子序列和,以及跨中间的最大子序列和;用递归。
*/
private static int maxSumReduce(int[] arr,int left,int right){
int maxLeftBorderSum=0,maxRightBorderSum=0;
int leftBorderSum=0,rightBorderSum=0;
int center=(left+right)/2;
// base case
if(left==right){
return arr[left]>0?arr[left]:0;
}
int maxLeftSum=maxSumReduce(arr,left,center);
int maxRightSum=maxSumReduce(arr,center+1,right);
for (int i=center;i>=left;i--){
leftBorderSum+=arr[i];
if(leftBorderSum>maxLeftBorderSum){
maxLeftBorderSum=leftBorderSum;
}
}
for (int j=center+1;j<=right;j++){
rightBorderSum+=arr[j];
if(rightBorderSum>maxRightBorderSum){
maxRightBorderSum=rightBorderSum;
}
}
return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);
}
private static int max3(int a,int b,int c){
return a>b?a>c?a:c:b>c?b:c;
}
/*
最高效的求最大子序列和算法,时间是线性。O(N)
*/
private static int maxSubSum(int[] a){
int maxSum=0;
int thisSum=0;
int length=a.length;
for (int j=0;j<length;j++){
thisSum+=a[j];
if(thisSum>maxSum){
maxSum=thisSum;
}else if(thisSum<0){
thisSum=0;
}
}
return maxSum;
}
-
参考《数据结构与算法分析Java语言描述》