数据结构与算法 求最大子序列

本文介绍了两种求解最大子数组和的方法:递归算法和更高效的线性时间复杂度算法。递归方法通过分解问题为左右子数组及跨越中点的子数组来寻找最大和。而最佳算法采用动态规划思想,只需遍历一次数组即可得到结果。

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;
}


评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值