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.代碼實現
public class MaxArry {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {-2,11,-4,13,-5,-5,-2};
int result = maxSunArray(array);
System.out.println("連續子數組之最大和為:"+result);
}
public static int maxSunArray(int[] array) {
if (array.length==0 || array==null) {
return 0;
}
int Sum = 0;
int max = 0;
for (int i = 0; i < array.length; i++) {
if(Sum<=0){ //如果當前連續n項的和小於等於0,則沒必要與后面的元素相加
Sum = array[i]; //Sum重新賦值
}else{
Sum += array[i]; //如果Sum的值大於0,則繼續與后面的元素相加,
}
if(Sum>max){ //每次改變Sum的值都有與max進行比較
max = Sum; //如果Sum的值大於max,則將Sum的值賦值給max
}
}
return max;
}
}
代碼中只用了一個for循環,所以其算法的時間復雜度為O(n)。
3.單元測試選擇:條件組合覆蓋
覆蓋標准:
使得每個判定中條件的各種可能組合都至少出現一次。
其中條件選擇的程序流程圖如下

條件組合 |
執行路徑 |
sum<=0,sum>max |
abdef |
sum>0,sum>max |
acdef |
sum>0,sum>=max |
acdf |
sum<=0,sum>=max |
abdf |
測試數據只需要一組[1,2,-3,2]即可實現上述四種執行路徑
4.測試代碼
import static org.junit.Assert.*;
import org.junit.Test;
public class ArrayMaxTest {
int[] array={1,2,-3,2};
@Test
public void MaxSunArrayTest() {
assertEquals(3,new ArrayMax().maxSunArray(array));
}
}
測試結果
