https://github.com/ljshLLW/homeworkgit
給定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。
-- 引用自《百度百科》github
從數組一個值開始累加,並記錄下最大值,當前和。若是當前和小於0則置0,由於加上一個小於0確定變小,當前和不小於等於0的話,全部數加上當前和都會變大。數組
func = lambda x: x>0 and x or 0 def MaxSubArray(array): maxSum = 0 thisSum = 0 for i in range(len(array)): thisSum = func(thisSum+array[i]) maxSum = max(thisSum,maxSum) return maxSum
採用條件組合覆蓋測試
len(array)<0 AH 符合條件爲[]
len(array)>0 AB...BHthisCDFI array[i]爲負數 thisSum爲正加一個大於thisSum絕對值的負數 例如[1,2,-1]
CDFGI array[i]爲正數 thisSum爲任意值加一個正數以後小於max 例如[1,2,3]
CEFI array[i]爲負數 thisSum爲任意值加一個比thisSum的相反數小的數 例如[-1,-2,-3]
CEFGI 永不成立
符合上述條件可總結爲一個數組[7,-4,-6]
[7,]知足CDFGI
[7,-4]知足CDFI
[7,-4,-6]知足CEFIspa
import unittest from MaxSubarray import MaxSubArray class TestMaxSubArrayFunc(unittest.TestCase): def test_Empty(self): self.assertEqual(0,MaxSubArray([])) def test_AB_BH(self): self.assertEqual(7,MaxSubArray([7,-4,-6])) if __name__ == '__main__': unittest.main(verbosity=2)
多加練習3d