最大连续子数组求和

题目描述:

HZ偶尔会拿些专业问题来忽悠拿些非计算机专业 的同学。今天测试组开完会后,他又发话了:
* 在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候问题很
* 好解决。但是,如果向量中包含负数,是否应该包含某个负数,并且期望旁边的整数会弥补它呢?
* 例如:{6,-3,2,7,-15,1,2,2},子向量的最大和为8(从第0个开始,到第三个为止)
* 给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

解题思路:

状态:
*  子状态:长度为1,2,3,...,n的子数组的和的最大值
*  F(i):长度为i的子数组和的最大值,这种定义不能形成递推关系,舍弃
*  F(i):以arr[i]为末尾元素的子数组和的最大值
*
*  状态递推:
*  F(i)=max(F(i-1)+arr[i],arr[i])
*  F(i)=(F(i-1)>0)?F(i-1)+arr[i]:arr[i]
*
*  初始值:F(0)=arr[0]
*  返回结果:
*  maxsum:所有F(i)中的最大值
*  maxsum=max(maxsum,F(i))

代码:

 public static int FindGreatestSumOfSubArray(int[] arr){
        if(arr.length == 0 || arr== null) return 0;
        //F(i)初始化-->初始值
        int sum=arr[0];
        //maxsum初始化
        int maxSum=arr[0];
        for(int i=1;i<arr.length;i++){
            //F(i)=(F(i-1)>0)?F(i-1)+arr[i]:arr[i]
            sum=(sum>0)?sum+arr[i]:arr[i];
            //maxSum=max(maxSum,F(i))
            maxSum=(sum<maxSum)?maxSum:sum;
        }
        return maxSum;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值