最大连续子数组之和

一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的)

 

给人典型的动态规划的感觉。先求到前面i个元素的最大子数组之和max,然后在此基础上考虑i+1的情况,直至n位置。

 

public  class MaxSubArray{
    public static void main(String[] args){
        int[] a = new int[]{ -2, 5, 3, -6, 4, -8, 6};
        System.out.println(getMax(a));
    }
    public static int getMax(int[] a){
        //max保存的是最大值
        int max = a[0];
        //max2保存的是遍历过程中可能的最大值
        int max2 = a[0];
        for(int i=1;i<a.length;i++){
            //总共4种情况
            //1. a[i]>0,max2>0 : 这个时候二者相加是可能的最大值
            //2. a[i]>0,max2<0 :这个时候a[i]是可能的最大值
            //3. a[i]<0,max2>0 : 这个时候二者相加是可能的最大值
            //4. a[i]<0,max2<0 :这个时候a[i]是可能的最大值
            if(a[i]>=0){
                if(max2 >= 0){
                    max2 += a[i];
                }else{
                    max2 = a[i];
                }
            }else{
                if(max2 >= 0){
                    max2 += a[i];
                }else{
                    max2 = a[i];
                }
            }
            if(max2 > max){
                max = max2;
            }
        }
        return max;
    }
}

 

 

代码精简后

public  class MaxSubArray{
	public static void main(String[] args){
		int[] a = new int[]{ -2, 5, 3, -6, 4, -8, 6};
		System.out.println(getMax(a));
	}
	public static int getMax(int[] a){
		//max保存的是最大值
		int max = a[0];
		//max2保存的是遍历过程中可能的最大值
		int max2 = a[0];
		for(int i=1;i<a.length;i++){
			//max2大于0,则相加可能得到最大值
			if(max2 >= 0){
				max2 += a[i];
			}
			//max2小于0,则相加不可能达到最大值,直接取a[i]
			else{
				max2 = a[i];
			}
			//更新最大值
			if(max2 > max){
				max = max2;
			}
		}
		return max;
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值