题目
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
,
输出: 6
解释: 连续子数组 [4,-1,2,1]
的和最大,为 6。
进阶:
如果你已经实现复杂度为 的解法,尝试使用更为精妙的分治法求解。
方案一(动态规划)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 动态规划
if not nums:
return 0
# dp[i][j] 表示区间 nums[i:j] 的和的最大值 i < j,所以最终 dp table 为一个三角形
dp = [[-float('inf')] * len(nums) for i in range(len(nums)) ]
# init
res = -float('inf')
for i in range(len(nums)):
dp[i][i] = nums[i]
res = max(res, dp[i][i])
if i == 0:
continue
dp[0][i] = dp[0][i - 1] + nums[i]
res = max(res, dp[0][i])
# dp 阶段
for i in range(1, len(nums)):
for j in range(i + 1, len(nums)):
dp[i][j] = max(dp[i - 1][j - 1], dp[i][j - 1]) + nums[j]
res = max(res, dp[i][j])
return res
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# dp[i] 表示以当前元素结尾的子数组的最大值, dp[i + 1] = max(nums[i + 1], dp[i] + nums[i + 1])
dp = []
# init
dp.append(nums[0])
# dp
for i in range(1, len(nums)):
dp.append(max(dp[i - 1] + nums[i], nums[i]))
return max(dp)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# dp[i] 表示以当前元素结尾的子数组的最大值, dp[i + 1] = max(nums[i + 1], dp[i] + nums[i + 1])
for i in range(1, len(nums)):
nums[i] = max(nums[i - 1] + nums[i], nums[i])
return max(nums)
方案三(分治)
原文
https://leetcode-cn.com/explore/interview/card/2020-top-interview-questions/278/classic-problems/1236/
https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode/