最大子序和
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
分治法求解思路:将原问题转化为求解子问题,通过子问题的解求解原问题的解。
原问题:求整数数组中,具有最大和的连续子数组。
子问题:取数组中位于中间位置的值middle
,middle
左侧的子数组leftnums
,middle
右侧子数组rightnums
。分别求leftnums
,rightnums
中最大和left
和right
,和包含中间值middle
并跨越leftnums
和rightnums
的最大和mid。最终结果为max(left, mid, right)
.
递归求解子问题,获得原问题的解。
Python3代码示例:
class Solution:
def maxSubArray(self, nums: List[int]) -> int: # 求解原问题
if len(nums) == 0: # 长度为 0,直接返回 0
return 0
maxlen = self.maxArray(nums, 0, len(nums)-1) # 开始将原问题划分为子问题
return maxlen # 返回解
def maxArray(self, nums:List[int], l:int, r:int) -> int: # 递归求解子问题
if l == r: # 递归终止条件
return nums[l]
mid = (l+r)//2 # 划分三个子问题
leftlen = self.maxArray(nums, l, mid) # 继续划分左子问题
rightlen = self.maxArray(nums, mid+1, r) # 继续划分右子问题
midlen = self.maxmidArray(nums, l, mid, r) # 求解子问题
return max(leftlen, rightlen, midlen) # 返回子问题解
def maxmidArray(self, nums:List[int], l:int, mid:int, r:int) -> int: # 求解子问题 middle代码
leftlen = -float('inf') # 包含中值 middle的左侧最大值
sum = 0
for item in range(mid, l-1, -1):
sum += nums[item]
if sum > leftlen:
leftlen = sum
rightlen = -float('inf') # 不包含 middle的右侧最大值
sum = 0
for item in range(mid+1, r+1):
sum += nums[item]
if sum > rightlen:
rightlen = sum
return leftlen+rightlen # 最终结果两个值相加