問題描述:
輸入一個整型數組,數組裏有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。
要求時間複雜度爲O(n)。
示例1:
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
問題分析:
本題可以使用動態規劃解決。動態規劃方法也可以認爲是填表法,需要構造出一張動態規劃表。這裏構造一張表,表中每個位置的元素值表示:當前位置爲子數組的最後一個位置時的最大值。具體的做法爲:
- 初始化:定義變量maxv記錄子數組的最大和,初始值爲列表的第一個元素lists[0];
- 對列表進行遍歷,如果前一個元素的值爲負數,那麼當前元素值不變;如果爲正,那麼加上前一個元素值作爲當前元素值;
- 將當前元素值與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
轉存失敗重新上傳取消