最大连续子数组和,最大连续子数组乘积

  1. 最大连续子数组和

动态规划的是首先对数组进行遍历,当前最大连续子序列和为 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


  1. 最大连续子数组乘积
    在这里插入图片描述
    我们需要维护目前为止的最大值,最小值,和最终的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对应题目题解。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值