原题地址
方法1-动态规划
思路
给定一个整数数组
nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
看到这个题干,很容易想到 动态规划 。
既然要找具有最大和的连续子数组,那我们就把以第 i 个元素结尾的最大连续子数组都找出来,其中最大的那个就是全局的最大连续子数组。
定义 dp 数组,其中 dp[i] 表示以第 i 个元素结尾的最大和连续子数组。
递推公式为:
初试条件为 dp[0] = nums[0]
最后 dp 数组中最大的那个数就是最大和连续子数组的最大和。
代码1
class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)if n == 0: return 0dp = [nums[0]]for i in range(1, n):if dp[i-1] >= 0:dp.append(dp[i-1] + nums[i])else:dp.append(nums[i])return max(dp)
代码2
其实我们可以发现,由于 dp[0]=nums[0] ,而 dp[i] 只与 dp[i-1] 和 nums[i] 有关,所以可以在原数组上修改,而不用定义 dp 数组,这样空间复杂度就为 O(1)
class Solution:def maxSubArray(self, nums: List[int]) -> int:if len(nums) == 0: return 0for i in range(1, len(nums)):if nums[i-1] >= 0:nums[i] += nums[i-1]return max(nums)
时空复杂度
时间复杂度为 O(N) ,空间复杂度为 O(1)
