部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

编程之美--2.14求数组的子数组之和的最大值

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

main函数

public static void main(String args[]){
    int[] arr0 = {1,-2,3,5,-3,2};
    int[] arr1 = {0,-2,3,5,-1,2};
    int[] arr2 = {-9,-2,-3,-5,-3};
    System.out.println("解法1:");
    MaxSum(arr0);
    MaxSum(arr1);
    MaxSum(arr2);
    
    System.out.println("\n解法2:");
    MaxSum2(arr0);
    MaxSum2(arr1);
    MaxSum2(arr2);
}

解法1:

public static int MaxSum(int[] arr){
    int sum = arr[0];
    int max_sum = arr[0];
    
    int index_start = 0;
    int index_start_max = 0;
    int index_end = 0;
    int index_end_max = 0;
    
    int len = arr.length;
    for(int i =1 ; i<len ;i++){
        if(sum<0){ //实际上是if(sum+arr<arr)
            sum = arr[i];
            index_start = i;
            index_end = i;
        }else{
            sum +=arr[i];
            index_end = i;
        }
        if(sum>max_sum){
            max_sum = sum;
            index_start_max = index_start;
            index_end_max = index_end;
        }
    }
    System.out.println("连续子数组最大的和sum="+max_sum);
    System.out.println("下标开始位置:"+index_start_max + ", 下标结束位置:"+index_end_max);
    return max_sum;
}

结果:

解法1:
连续子数组最大的和sum=8
下标开始位置:2, 下标结束位置:3
连续子数组最大的和sum=9
下标开始位置:2, 下标结束位置:5
连续子数组最大的和sum=-2
下标开始位置:1, 下标结束位置:1

-----------------------------------------

解法2:实际上和解法1相同,解法二从后向前进行,且解法1多了指示起止位置的功能,解法二不行

//解法2 实际上和解法1相同,解法1多了指示起始位置的功能
public static int MaxSum2(int[]  arr){
    int len = arr.length;
    int start = arr[len-1];
    int all = arr[len-1];
    
    for(int i = len-2 ; i>=0 ;i --){
        start = Math.max(arr[i], arr[i]+start);
        all = Math.max(start, all);
    }
    System.out.println("MaxSum="+all);
    return all;
}

结果:

解法2:
MaxSum=8
MaxSum=9
MaxSum=-2

 

posted @ 2015-06-18 20:34  流了个火  阅读(107)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats