目錄
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