题目描述: 最大子序和
给定一个序列(至少含有 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)