题目

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

image.png

思路

一、动态规划

考虑当前位置i,能组成的最大子序和dp[i]与dp[i - 1]有关。
如果dp[i - 1] > 0 , 则dp[i] = nums[i] + dp[i - 1]
否则,dp[i] = nums[i]。

二、分治

  • todo

代码

  1. class Solution:
  2. def maxSubArray(self, nums: List[int]) -> int:
  3. if len(nums) == 0: return 0
  4. if len(nums) == 1: return nums[0]
  5. dp = nums[:]
  6. for i in range(1, len(nums)):
  7. if dp[i - 1] > 0:
  8. dp[i] = nums[i] + dp[i - 1]
  9. return max(dp)

优化一下,不需要dp_table,只需要两个变量就行。
一个localMax保存局部最大的子序和,一个globalMax保存全局最大的子序和。

  1. class Solution:
  2. def maxSubArray(self, nums: List[int]) -> int:
  3. localMax, globalMax = nums[0], nums[0]
  4. for num in nums[1:]:
  5. if localMax <= 0:
  6. localMax = num
  7. else:
  8. localMax += num
  9. globalMax = max(globalMax, localMax)
  10. # print(globalMax)
  11. return globalMax