
暴力解法超出时间
python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
left = 0
maxsum = -float('inf')
for right in range(len(nums)):
winsum = 0
for i in range(right, len(nums)):
winsum += nums[i]
maxsum = max(winsum, maxsum)
return maxsum
动态规划的状态定义
设 dp[i] 表示以 nums[i] 结尾的子数组的最大和:
- 如果dp[i-1]是负数,那么无论nums[i]是正数还是负数,以nums[i]结尾的子数组的最大和dp[i] 为nums[i]。 (不要累加前面的负数结果)
- 如果dp[i-1]是正数,那么无论nums[i]是正数还是负数,以nums[i]结尾的子数组的最大和号dp[i] 为dp[i-1]+nums[i]。 (累加前面的正数结果)
即每轮迭代 dp[i] 的更新为:dp[i] = max(nums[i], dp[i-1] + nums[i])
再与之前的迭代结果比较: maxsum = max(dp[i] ,maxsum)
python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
dp = [0] * len(nums)
dp[0] = nums[0]
maxsum = dp[0]
for i in range(1,len(nums)):
dp[i] = max(nums[i], dp[i-1] + nums[i])
maxsum = max(maxsum, dp[i])
return maxsum
时间复杂度:O(n),其中 n 是数组的长度,因为我们只遍历一遍数组。
空间复杂度:O(n),需要存储 dp 数组