算法筆記_043:最大連續子數組和(Java)


目錄

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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM