- 最大连续子数组和
动态规划的是首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字
每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果
维护两个变量,在动态规划过程中,一个是tmp_sum即降维了的dp数组dp[i], 一个是最终答案ans。
每个i都要记得更新一次ans,因为最大连续子数组和不一定发生在最终状态。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
tmp_sum = 0
res = nums[0]
for num in nums:
tmp_sum = max(tmp_sum + num, num)
res = max(res, tmp_sum)
return res
- 最大连续子数组乘积
我们需要维护目前为止的最大值,最小值,和最终的ans。
因为最大值可能因为*当前元素为负数就变成最小值。
为什么更新Max和Min要带上nums[i]?因为如果nums[i] == 0, 那么Max,Min都会成0,然后下一轮从max[i+1] = max(nums[i+1], max[i+1], min[i+1]) = nums[i+1] 重新开始。
每个i都要记得更新一次ans,因为最大连续子数组乘积不一定发生在最终状态。
class Solution:
# @param {integer[]} nums
# @return {integer}
def maxProduct(self, nums):
# 将currentMax, currentMin, ans都初始化为第一个数组元素
currentMax, currentMin, ans = nums[0], nums[0], nums[0]
for i in range(1, len(nums)):
n = nums[i]
# 事先保存currentMax[i-1]
tmp = currentMax
# 更新currentMax[i-1] to currentMax[i]
currentMax = max(n, n*currentMax, n*currentMin)
# 更新currentMax[i-1] to currentMax[i]
currentMin = min(n, n*tmp, n*currentMin)
# 更新 ans
ans = max(ans, currentMax)
return ans
代码摘自leetcode对应题目题解。