题目
给定一个整数数组 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)) ]# initres = -float('inf')for i in range(len(nums)):dp[i][i] = nums[i]res = max(res, dp[i][i])if i == 0:continuedp[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 = []# initdp.append(nums[0])# dpfor 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/
