問題: 給定n個整數(可能爲負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均爲負數時定義子段和爲0,依此定義,所求的最優值爲: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n 例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和爲20。
-- 引用自百度百科java
爲了求數組最大字段和,須定義變量max,currentSum分別保存最大值和當前和。初值均設爲零,對currentSum進行循環加法,當currentSum<=0時,將currentSum值重置爲num[i],不然currentSum=currentSum+num[i]。將max與currentSum進行比較,若後者大則max賦值爲currentSum,不然不變。最終結果即爲最大字段和。git
coding連接:https://coding.net/u/INeedAPassport/p/JunitTest_2/git?public=true數組
package code; import java.util.Scanner; public class maxNU { public void main(String[] args) { Scanner inport=new Scanner(System.in); int i,n; int[] num=new int[100]; n=inport.nextInt(); for(i=0;i<n;i++) num[i]=inport.nextInt(); int result = sum(num); System.out.println("連續子元素的最大和爲:"+result); inport.close(); } public int sum(int[] num) { if (num.length==0 || num==null) { return 0; } int currentSum = 0; int max = 0; for (int i = 0; i <num.length; i++) { if(currentSum<=0){ currentSum = num[i]; }else{ currentSum = currentSum + num[i]; } if(currentSum>max){ max = currentSum; } } return max; } }
由圖知測試程序須要涵蓋如下狀況:測試
數組num爲空 | currentSum<=0 | currentSum>max |
---|---|---|
數組num不爲空 | currentSum>0 | currentSum>max |
package code; import static org.junit.Assert.*; import org.junit.Test; public class test { @Test public void sum1() { assertEquals(0, new maxNU().sum(new int[] {} )); } @Test public void sum2() { assertEquals(20,new maxNU().sum(new int[] {-2,11,-4,13,-5,-2} )); } @Test public void sum3() { assertEquals(0, new maxNU().sum(new int[] {-2,-11,-4,-13,-5,-2} )); } @Test public void sum4() { assertEquals(12, new maxNU().sum(new int[] {1,4,7} )); }