Python中有一道經(jīng)典的算法題叫做最大子序和。這個問題的解法非常精巧,利用了動態(tài)規(guī)劃的思想。
def maxSubArray(nums): currSum = 0 maxSum = nums[0] for i in range(len(nums)): currSum = max(nums[i], currSum + nums[i]) maxSum = max(maxSum, currSum) return maxSum
代碼中的maxSubArray函數(shù)接收一個整數(shù)數(shù)組nums,返回其中和最大的連續(xù)子序列的和。算法的關(guān)鍵在于currSum和maxSum兩個變量。currSum表示以當前位置為結(jié)尾的最大子序列和,而maxSum表示遍歷過的子序列和的最大值。在遍歷過程中,若currSum為負數(shù),則對后面的子序列來說,只會拖累它們的和,因此應該舍棄,更新為nums[i];否則將currSum與nums[i]相加更新為新的currSum。同時,每次更新maxSum,使其取當前的maxSum和currSum的最大值即可。
使用該算法解決最大子序和的時間復雜度為O(n),非常高效。考慮到該算法過于精巧,很難想到,建議大家在學習動態(tài)規(guī)劃時多加練習,多讀一些相關(guān)算法題和題解。