java---最大連續子數組和(最大子段和)


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)。

代碼已上傳到coding.net

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));
	}

}

測試結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM