GITHUB代碼地址:https://github.com/wuxuezeproject/-
最大連續子數組和(最大子段和)
問題描述: 給定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。git
程序的主要方程爲Sum = (Sum + array[i]) > (array[i]) ? (Sum + array[i]) : (array[i]);
最大和要麼是前面所求最大和加下一項,要麼是下一項。具體程序流程圖以下:
github
int GetSum(int* array, int num) { if (array == NULL) return 0; int i; int Max{ array[0] }; int Sum{ array[0] }; for (i = 1; i < num; i++) { Sum = (Sum + array[i]) > (array[i]) ? (Sum + array[i]) : (array[i]); if (Sum > Max) { Max = Sum; } } if (Max < 0) { Max = 0; } return Max; }
本次測試,我採用的是條件組合測試。本次測試中涉及到的條件選擇共有四個,一共有九種組合方式。數組
條件選擇的可能性組合的二叉圖以下:
單元測試
針對上面的九種條件組合,對應的設計案例以下:學習
array==NULL? | sum取值 | sum>max? | max<0? | 測試用例 | 結果 |
---|---|---|---|---|---|
array==NULL | {} | 0 | |||
array!=NULL | sum=(sum+array[[i]) | sum>max | max>0 | {2,2,2} | 6 |
array!=NULL | sum=(sum+array[[i]) | sum>max | max<0 | 不存在 | 無 |
array!=NULL | sum=(sum+array[[i]) | sum<max | max>0 | {5,,-2,3} | 6 |
array!=NULL | sum=(sum+array[[i]) | sum<max | max<0 | 不存在 | 無 |
array!=NULL | sum= array[[i]) | sum>max | max>0 | {-2,5,3} | 8 |
array!=NULL | sum= array[[i]) | sum>max | max<0 | {-2,-1,-3} | 0 |
array!=NULL | sum= array[[i]) | sum<max | max>0 | 不存在 | 無 |
array!=NULL | sum= array[[i]) | sum<max | max<0 | {-2,-3,-5} | 0 |
測試代碼以下:測試
TEST_METHOD(TestMethod1) //array==NULL { int *array = {}; int num = sizeof(array) / sizeof(array[0]); int Max = GetSum(array, num); Assert::AreEqual(Max, 0); } TEST_METHOD(TestMethod2) //(sum=sum+array)&&(sum>max)&&(max>0) { int array[] = { 2,2,2 }; int num = sizeof(array) / sizeof(array[0]); int Max = GetSum(array, num); Assert::AreEqual(Max, 6); } TEST_METHOD(TestMethod3) //(sum=sum+array)&&(sum<max)&&(max>0) { int array[] = { 5,-2,3 }; int num = sizeof(array) / sizeof(array[0]); int Max = GetSum(array, num); Assert::AreEqual(Max, 6); } TEST_METHOD(TestMethod4) //(sum=array)&&(sum>max)&&(max>0) { int array[] = { -2,5,3 }; int num = sizeof(array) / sizeof(array[0]); int Max = GetSum(array, num); Assert::AreEqual(Max, 8); } TEST_METHOD(TestMethod5) //(sum=array)&&(sum>max)&&(max<0) { int array[] = { -2,-1,-3 }; int num = sizeof(array) / sizeof(array[0]); int Max = GetSum(array, num); Assert::AreEqual(Max, 0); } TEST_METHOD(TestMethod6) //(sum=array)&&(sum<max)&&(max<0) { int array[] = { -2,-3,-5 }; int num = sizeof(array) / sizeof(array[0]); int Max = GetSum(array, num); Assert::AreEqual(Max, 0); }
測試時用例所有經過,結果以下:
設計
本次做業,學到了簡單的我的項目的開發,也更加熟悉了單元測試,可以對不一樣類型的條件進行單元測試,收穫滿滿。
每一次做業都會有新的收穫,我也會在學習的道路上一直走下去,屏幕前的你,也要加油啊! code