【leetcode】連續子數組的最大和

問題描述:

        輸入一個整型數組,數組裏有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。

         要求時間複雜度爲O(n)。

示例1:

輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

問題分析:

       本題可以使用動態規劃解決。動態規劃方法也可以認爲是填表法,需要構造出一張動態規劃表。這裏構造一張表,表中每個位置的元素值表示:當前位置爲子數組的最後一個位置時的最大值。具體的做法爲:

  1. 初始化:定義變量maxv記錄子數組的最大和,初始值爲列表的第一個元素lists[0];
  2. 對列表進行遍歷,如果前一個元素的值爲負數,那麼當前元素值不變;如果爲正,那麼加上前一個元素值作爲當前元素值;
  3. 將當前元素值與maxv進行比較,maxv取其中較大的值

以列表nums = [-2,1,-3,4,-1,2,1,-5,4]爲例:

 

nums -2 1 -3 4 -1 2 1 -5 4
dp -2 1 -2 4 3 5 6 1 5
maxv -2 1 1 4 4 5 6 6 6

 

算法分析:

          該算法只需要對nums數組進行一次遍歷,因此時間複雜度爲O(n)。使用常數大小的額外空間,空間複雜度爲O(1)。

編碼實現:

class Solution:
    def maxSubArray(self, lists: List[int]) -> int:
        maxv = lists[0]
        for i in range(1,len(lists)):
            if lists[i-1]>0:
                lists[i] += lists[i-1]
            if lists[i] > maxv:
                maxv = lists[i]
        return maxv
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==uploading.4e448015.gif轉存失敗重新上傳取消wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章