有些人表面風光,背地裏for循環怎麼寫都要百度

代碼地址

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的話,全部數加上當前和都會變大。數組

流程圖

代碼實現(Py)

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...BHthis

CDFI 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

相關文章
相關標籤/搜索