1.递归:
分别求出左半部、右半部以及包含中间部分的最大值。
public int maxSum(int[] a,int left,int right){
if(left==right){
return a[left]; //基准情形
}
int center=(left+right)/2;
int maxleft=maxSum(a,left,center);
int maxright=maxSum(a,center+1,right);
int leftsum=0,maxleftsum=Integer.MIN_VALUE;
for(int i=center;i>=left;i--){
leftsum+=a[i];
if(maxleftsum<leftsum){
maxleftsum=leftsum;
}
}
int rightsum=0,maxrightsum=Integer.MIN_VALUE;
for(int i=center+1;i<=right;i++){
rightsum+=a[i];
if(maxrightsum<rightsum){
maxrightsum=rightsum;
}
}
return max3(maxleftsum+maxrightsum,maxleft,maxright);
}
public int max3(int a,int b,int c){
return a>=b?(a>=c?a:c):(b>=c?b:c);
}2.最佳算法:
public int maxSum(int[] a){
int max=Integer.MIN_VALUE,sum=0;
for(int i=0;i<a.length;i++){
sum+=a[i];
if(max<sum)
max=sum;
else if(sum<=0)
sum=0;
}
return max;
}
本文介绍了两种求解最大子数组和的方法:递归算法和更高效的线性时间复杂度算法。递归方法通过分解问题为左右子数组及跨越中点的子数组来寻找最大和。而最佳算法采用动态规划思想,只需遍历一次数组即可得到结果。

2251

被折叠的 条评论
为什么被折叠?



