
暴力解法超出时间
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
动态规划的状态定义
设 dpi 表示以 numsi 结尾的子数组的最大和:
- 如果dpi-1是负数,那么无论numsi是正数还是负数,以numsi结尾的子数组的最大和dpi 为numsi。 (不要累加前面的负数结果)
- 如果dpi-1是正数,那么无论numsi是正数还是负数,以numsi结尾的子数组的最大和号dpi 为dpi-1+numsi。 (累加前面的正数结果)
即每轮迭代 dpi 的更新为:dpi = max(numsi, dpi-1 + numsi)
再与之前的迭代结果比较: maxsum = max(dpi ,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 数组