连加和最大子数组

穷举法:

穷举法:
    例:
         1 -2 4  3  -1  -4
    j=0  1到-4找最大子序列、保存下标start、end
    j=1  -2到-4..
    j=2   4到-4..  
    .
    j=5
此算法遍历了所有情况、时间复杂度为O(n2)

public void find(int[] array){
    int maxSum=array[0];
    int currentSum=0;
    int start=0;//记录最大值的开始与结尾
    int end=0;
    for(int i=0;i<array.length;i++){
        for(int j=i;j<array.length;j++){
            currentSum+=array[j];
            if(currentSum>maxSum){
                maxSum=currentSum;
                start=i;
                end=j;
            }
            currentSum=0;
        }
    }
    for(int i=start;i<=end;i++){
        System.out.print(array[i]);
        if(i!=end){
            System.out.print(",");
        }
    }
}

动态规划:

例:
         1 -2 4  3  -1  -4

    sum  1 -1 4  7  6   2

思路:动态归化时将问题化解为几个相互关联的问题、分解复杂度。
     若sum[i-1]>0,则最大值为sum[i]=sum[i-1]+array[i]
                 否则为sum[i]=array[i]并更新start。
     判断lastSum与maxSum,更新end
public static void find(int[] array){
    int lastSum=0;
    int maxSum=array[0];
    int start=0;
    int end=0;
    for(int i=0;i<array.length;i++){
        //lastSum最大和
        if(lastSum>0){
            lastSum=lastSum+array[i];
        }else{
            lastSum=array[i];
            start=i;
        }
        //若大于则更新
        if(maxSum<lastSum){
            maxSum=lastSum;
            end=i;
        }
    }
    for(int i=start;i<=end;i++){
        System.out.print(array[i]);
        if(i!=end){
            System.out.print(",");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/linkingfei/article/details/81779906