剑指offer:连续子数组的最大和

题目:例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

动态规划: 

/**
 * @author :GY
 * @version :1.0
 * @ClassName :
 * @Description TODO
 * @date :Created in 2019/4/14 19:20
 * @description :连续子数组的最大和,下标不一定从0开始
 * 动态规划:通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
 */
public class Q30 {
    public static void main(String[] args) {
        int[] array={6,-3,-2,7,-15,1,2,2};
        int [] array1={1,-2,3,-4,5,6,-7,-8,-9,12,10};
        int[] array2={-2,-8,-1,-5,-9};
        int [] array3={1,-2,3,10,-4,7,2,-5};
        int value=0;
        //value=FindGreatestSumOfSubArray(array2);
        value=FindGreatestSumOfSubArrayTest(array);
        System.out.println(value);
    }

//    动态规划-终极版
    /*
     * value=上一个最大子数组的和
     * sum=max(sum+array[i],array[i])
     * value=max(value,sum);
    *
    * 记录上一个最大子数组的和,
    * 取sum+array[i],sum之间的最大值sum
    * 取此次的数组和与上次的数组和的最大值
    * */
    public static  int FindGreatestSumOfSubArrayTest(int[] array) {
        int sum=0;
        int value=array[0];
        for (int i=0;i<array.length;i++){
            sum=Math.max(sum+array[i],array[i]);
            value=Math.max(value,sum);
        }
        return value;
    }


//    动态规划-低级版
    /*如果sum被加上arra[i]之后。还没有array[i]大,则子序列从array[i]开始。
    * 如果sum比上一次最大和大,则更新最大值*/
    public static  int FindGreatestSumOfSubArray(int[] array) {
        if (array==null||array.length==0){
            return 0;
        }
        int sum=0;
        int value=0;
        int count=array[0];
        for (int i=0;i<array.length;i++){
            value=sum;
            sum+=array[i];
//            解决最大和的连续子数组的下标不一定是从0开始
            if(value*sum<0||sum<array[i]){
                sum=array[i];
            }
//            更换最大和
            if (count<sum){
                count=sum;
            }
        }
        return count;
    }
}

 

全部评论

相关推荐

牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务