题目描述:

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

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐