最大连续子数组和(最大子段和)
1. 题目要求
问题: 给定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。
引用自《百度百科》
2. 环境
开发工具:eclipse
语言:JAVA
3. 设计思路
用数组存放数列,根据子数组第一位的位置与该子数组的长度得到子段和,将所有字段和中最大的数保存下来。
定义元素 | 作用 |
---|---|
n | 数列的总长度 |
a[ ] | 数列 |
m(n,a[ ]) | 子函数,返回值为最大子段和 |
a[i] | 数列第(i+1)个元素 |
S | 子段和 |
MAX | 已得出的最大字段和 |
4. 编写代码
- 子函数 m(根据已有的数列长度n与数列数组a[ ]求出最大子段和MAX)
public static int m(int n,int a[]) {
int i,j,MAX=0,S=0;
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
{
S=S+a[i+j];
if(MAX<S) MAX=S;
}
S=0;
}
return MAX;
}
- 主函数 main(输入数列长度n与数列数组a[ ]并调用子函数m,输出最大子段和)
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner (System.in);
System.out.println("请输入数列长度,按回车结束:\n");
int n=scanner.nextInt();
System.out.println("请输入数列,以空格隔开,回车结束:\n");
int [] a = new int[50];
for(int i=0; i<n; i++){
a[i] = scanner.nextInt();
}
int MAXCOUNT=m(n,a);
System.out.println(+MAXCOUNT);
}
5. 代码测试
- 测试用例
测试数据为3组,全负整数、全正整数与正负整数交替,满足语句覆盖、条件覆盖。
public class MAXSUMtext {
@Test
public void AAMAX1() {
int aa[]=new int[]{-1,-2,-3,-4,-5};
int bb=new MAX1.MAXSUM().m(5, aa);
assertEquals(0,bb);
}
@Test
public void AAMAX2() {
int aa[]=new int[]{1,2,3,4,5};
int bb=new MAX1.MAXSUM().m(5, aa);
assertEquals(15,bb);
}
@Test
public void AAMAX3() {
int aa[]=new int[]{-2,11,-4,13,-5,-2};
int bb=new MAX1.MAXSUM().m(6, aa);
assertEquals(20,bb);
}
}
测试结果
结果正确加入主函数的手动输入测试
结果正确
[代码](https://coding.net/u/ry2954/p/maxsum/git/blob/master/.gitignore?public=true)