问题: 给定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} )); }