題目描述: 最大子序和
給定一個序列(至少含有 1 個數),從該序列中尋找一個連續的子序列,使得子序列的和最大。
例如,給定序列 [-2,1,-3,4,-1,2,1,-5,4],
連續子序列 [4,-1,2,1] 的和最大,爲 6。
擴展練習:
若你已實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
第一種方法:動態規劃
求和,然後判斷和是否小於0,因爲只要前面的和小於0,那麼後面的數加上前面的和就一定比自身小,所以又重新求和,並和之前的最大子序和比較,取最大值。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
sumNum = 0
ans = nums[0]
for num in nums:
if sumNum > 0:
sumNum += num
else:
sumNum = num
ans = max(sumNum, ans)
return ans
第二種方法:分治法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return nums[0]
else:
max_left = self.maxSubArray(nums[:n // 2])
max_right = self.maxSubArray(nums[n // 2:])
max_l = nums[n // 2 - 1]
tmp = 0
for i in range(len(nums) // 2 - 1, -1, -1):
tmp += nums[i]
max_l = max(tmp, max_l)
max_r = nums[n // 2]
tmp = 0
for i in range(len(nums) // 2, len(nums)):
tmp += nums[i]
max_r = max(tmp, max_r)
return max(max_l + max_r, max_left, max_right)