演算法筆記_043:最大連續子陣列和(Java)

weixin_33896726發表於2017-02-21

目錄

1 問題描述

2 解決方案

2.1 蠻力列舉法

2.2 動態規劃法

 


1 問題描述

給定一個整數陣列,陣列裡可能有正數、負數和零。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。例如,如果輸入的陣列為{1,-2,3,10,-4,7,2,-5},和最大的子陣列為{3,10,-4,7,2},那麼輸出為該子陣列的和18

 


2 解決方案

2.1 蠻力列舉法

package com.liuzhen.array_2;

public class MaxSubArray {
    
    public int bruteMethod(int[] A){
        int maxResult = A[0];        
        int maxTemp = 0;;
        for(int i = 0;i < A.length;i++){
            for(int j = i;j < A.length;j++){
                for(int k = i;k <= j;k++){
                    maxTemp += A[k];
                }
                if(maxTemp > maxResult)
                    maxResult = maxTemp;
                maxTemp = 0;             //完成一個子序列求和後,重新賦值為0
            }
        }
        return maxResult;
    }
    
    public static void main(String[] args){
        MaxSubArray test = new MaxSubArray();
        int[] A = {1,-2,3,10,-4,7,2,10,-5,4};
        System.out.println("使用蠻力法求解陣列A的最大連續子陣列和為:"+test.bruteMethod(A));
    }
}

執行結果:

使用蠻力法求解陣列A的最大連續子陣列和為:28

 

2.2 動態規劃法

package com.liuzhen.array_2;

public class MaxSubArray {
    
    public int dynaticMethod(int[] A){
        int maxResult = A[0];   
        int maxTemp = 0;
        for(int i = 0;i < A.length;i++){
            if(maxTemp >= 0)
                maxTemp += A[i];
            else
                maxTemp = A[i];
            if(maxTemp > maxResult)
                maxResult = maxTemp;
        }
        return maxResult;
    }
    
    public static void main(String[] args){
        MaxSubArray test = new MaxSubArray();
        int[] A = {1,-2,3,10,-4,7,2,10,-5,4};
        System.out.println("使用動態規劃法求解陣列A的最大連續子陣列和為:"+test.dynaticMethod(A));
    }
}

執行結果:

使用動態規劃法求解陣列A的最大連續子陣列和為:28

 

 

 

相關文章