LeetCode 152. 乘积最大子数组(Medium)

在这里插入图片描述
【题目链接】

题解

  1. 不同于回溯、DP的tricks解法
  2. 画解算法:152. 乘积最大子序列

思路

  • 分类讨论
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 动态规划
    在这里插入图片描述

代码

class Solution:
    ### 1219 分类讨论(44 ms,15.4 MB)
    def maxProduct(self, nums: List[int]) -> int:
        # 将数组逆序,用于处理负数个数为奇数的情况,即处理单出来的负数在开头还是结尾的情况(逆向累乘)
        nums_reverse = nums[::-1]

        # 从第二个数开始计算乘积
        for i in range(1, len(nums)):
            # or 1 表示若nums[i-1]为0时,nums[i]重新将自己作为子数组的第一个元素
            nums[i] *= nums[i-1] or 1
            nums_reverse[i] *= nums_reverse[i-1] or 1

        return max(max(nums), max(nums_reverse)) # 最后返回:max(正向累乘中的最大累乘, 逆向累乘中的最大累乘)

    ### 1219 动态规划(44 ms,14.9 MB)
    def maxProduct(self, nums: List[int]) -> int:
        # 初始化:最大累乘max_accum为负无穷,第i个数的最大累乘imax为1,第i个数的最小累乘imin为1(维持两个最值)
        max_accum, imax, imin = float('-inf'), 1, 1

        # 对数组中的每一个数字计算累乘
        for num in nums:
            # 若当前数num为负数,则交换第i个数的最大累乘imax与最小累乘imin
            if num < 0: imax, imin = imin, imax

            # 根据当前数字num的情况来更新最大累乘imax与最小累乘imin
            imax = max(imax*num, num)
            imin = min(imin*num, num)

            # 每个数计算完后更新最大累乘max_accum
            max_accum = max(max_accum, imax)

        return max_accum # 返回最大累乘max_accum
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值