leetcode中等152乘积最大的子数组中等

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等152乘积最大的子数组中等相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
思路:动态规划
易错:转移方程不是!!
在这里插入图片描述
不只和前一个数有关!!
比如[-2,3,-2],最大值应该是12,之和前一个有关的话就变成3了!

正确:
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此,不只须需要dp_max,还需要维护当前最小值dp_min,以供随时反转

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        l=len(nums)
        dp_max=[-math.inf]*(l+1)
        dp_min=[-math.inf]*(l+1)
        dp_max[0] = dp_min[0] = 1;
        max_res=-math.inf
        for i in range(1,l+1):
            #如果是负数,需要交换dp
            if nums[i-1]<0:
                dp_max[i-1],dp_min[i-1]=dp_min[i-1],dp_max[i-1]
            dp_min[i] = min(nums[i - 1], dp_min[i - 1] * nums[i - 1]);
            dp_max[i] = max(nums[i - 1], dp_max[i - 1] * nums[i - 1]);
            max_res = max(max_res, dp_max[i])
        return(max_res)

简化:不要dp数组,只需要imax,imin两个数维护就可以

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        l=len(nums)
        imax=imin=1
        max_res=-math.inf
        for i in range(l):
            #如果是负数,需要交换dp
            if nums[i]<0:
                imax,imin=imin,imax
            imin=min(imin*nums[i],nums[i])
            imax=max(imax*nums[i],nums[i])
            max_res = max(max_res, imax)
        return(max_res)

以上是关于leetcode中等152乘积最大的子数组中等的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 152. 乘积最大子数组

⭐算法入门⭐《双指针》中等04 —— LeetCode 713. 乘积小于K的子数组

leetcode中等318最大单词长度乘积

leetcode中等318最大单词长度乘积

leetcode中等238除自身以外数组的乘积

⭐算法入门⭐《线性枚举》中等02 —— LeetCode 628. 三个数的最大乘积