給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-subarray
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max_sum = nums[0]
for index, num in enumerate(nums):
sum_num = 0
for _ in nums[index:]:
sum_num += _
if sum_num > max_sum:
max_sum = sum_num
return max_sum
結果:
執行用時 :8956 ms, 在所有 Python3 提交中擊敗了5.19%的用戶
內存消耗 :14.4 MB, 在所有 Python3 提交中擊敗了6.35%的用戶
思考:時間複雜度上來說屬於兩次遍歷,屬於O(n ^ 2)
先優化成O(n)
解題思路
對於每一個數,若前面的子數組和爲正,則加上前面的子數組作爲新的子數組,若爲負則保留自身作爲新的子數組;
每次遍歷都與當前最大子數組和做比較,保留較大者。代碼
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
maxSum = tempSum= nums[0]
for num in nums[1:]:
tempSum = max(num, num + tempSum)
maxSum = max(maxSum, tempSum)
return maxSum
DP
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
nums[i] = max(nums[i], nums[i] + nums[i-1])
return max(nums)
"""
動態規劃。
最重要的是搞清楚 dp 數組所存儲元素的意義
存儲的不是從 0 到 i 這個範圍內所得到的最大的連續子數組的和,而是以 nums[i] 爲結尾的子數組所能達到的最大的和。
[-2,1,-3,4,-1,2,1,-5,4]
-2 + 1 = -1 小於1 所以不變
[-2, 1, -3, 4, -1, 2, 1, -5, 4]
-3 + 1 = -2 大於-3 所以替換成-2
[-2, 1, -2, 4, -1, 2, 1, -5, 4]
4 + -2 = -2 小於4 所以4不變
[-2, 1, -2, 4, -1, 2, 1, -5, 4]
-1 + 4 = 3 大於-1 所以替換成3
[-2, 1, -2, 4, 3, 2, 1, -5, 4]
2 + 3 = 5 大於2 所以替換成5
[-2, 1, -2, 4, 3, 5, 1, -5, 4]
1 + 5 = 6 大於1 所以替換成6
[-2, 1, -2, 4, 3, 5, 6, -5, 4]
-5 + 6 = -1 小於6 所以不變
[-2, 1, -2, 4, 3, 5, 6, 1, 4]
4 + 1 = 5 大於4 所以替換成5
[-2, 1, -2, 4, 3, 5, 6, 1, 5]
"""