子数组的最大和



public class SubarrayMax {


public static void main(String[] args)
{
int[] a = {8,-1,-1,5,3,2,8,-9};

System.out.println(method1(a,a.length));
System.out.println(method2(a,a.length));
System.out.println(method3(a,a.length));

System.out.println(method4(a,0,a.length-1));
}


//分治思想
public static int method4(int a[],int left,int right){
if(left==right){
return max(a[left],0);
}
int middle=(left+right)/2;
//求(A[0],...A[n/2-1])中子数组包含A[n/2-1]的最大值
int lmaximum=0;
int lsum=0;
for(int i=middle;i>=left;i--){
lsum+=a[i];
if(lsum>lmaximum)
lmaximum=lsum;
}
//求(A[n/2],...,A[n-1])中子数组包含A[n/2]的最大值
int rmaximum=0;
int rsum=0;
for(int i=middle+1;i<=right;i++){
rsum+=a[i];
if(rsum>rmaximum)
rmaximum=rsum;
}
return max(lmaximum+rmaximum,max(method4(a,left,middle),method4(a,middle+1,right)));
}


public static int method3(int[] a,int n)
{
int nstart = a[n-1];
int nall = a[n-1];


for(int i=n-2;i>=0;i--)
{

if(nstart<0)
nstart = 0;
nstart +=a[i];

if(nstart>nall)
nall = nstart;
}

return nall;
}

//start 包含a[i]的最大值
//all 最大值
public static int method1(int a[],int n)
{

int[] start = new int[n];
int[] all = new int[n];

start[n-1] = a[n-1];
all[n-1] = a[n-1];

for(int i=n-2;i>=0;i--)
{
start[i] = max(a[i],a[i]+start[i+1]);
all[i] = max(start[i],all[i+1]);
}

return all[0];

}


//节省空间
public static int method2(int[] a,int n)
{
int nstart = a[n-1];
int nall = a[n-1];

for(int i=n-2;i>=0;i--)
{
nstart = max(a[i],nstart+a[i]);
nall = max(nstart,nall);
}

return nall;
}






private static int max(int i, int j) {
return i>j?i:j;
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值