leetcode 1567. 乘积为正数的最长子数组长度python

题目描述:

 题解:

动态规划

1.维护两个数组: dppos[i]表示以nums[i]结尾的积为正数的子数组长度,dpneg[i]表示以nums[i]结尾的积为负数的子数组长度,初始化为全0,如果nums[0]>0则dppos[0]=1,如果nums[i]<0则dpneg[0]=1

2.如果nums[i]>0,则dppos[i]=dppos[i-1]+1,对dpneg的处理比较特殊,如果dpneg[i-1]为0,那么dpneg[i]仍然应该为0.比如数组[0,1],0对应的dppos[0] dpneg[0]都为0,1对应的dppos[1]=1(对应子数组[1]),1对应的dpneg[1]应该仍为0.

3.如果nums[i]<0,那么dppos[i]应该为dpneg[i-1]+1(因为nums[i]必须乘以一个负数,积才为正数),如果dpneg[i-1]=0,则dppos[i]也为0。dpneg[i]=dppos[i-1]+1,此时不用判断dppos[i-1]是否为0,因为即使dppos[i-1]=0 dppos[i]也成立,对应子数组nums[i]。

总结:

如果nums[i]>0,在更新dpneg[i]的时候要判断,如果nums[i]<0,更新dppos[i]的时候要判断。

如果nums[i]<0,dppos[i]在dpneg[i-1]基础上,dpneg[i]在dppos[i-1]基础上更新。

class Solution:
    def getMaxLen(self, nums: List[int]) -> int:
        dppos = [0 for i in range(len(nums))]
        dpneg = [0 for i in range(len(nums))]
        if nums[0]>0:
            dppos[0] = 1
        if nums[0]<0:
            dpneg[0] = 1
        for i in range(1,len(nums)):
            if nums[i]>0:
                dppos[i] = dppos[i-1]+1
                if dpneg[i-1]>0:
                    dpneg[i] = dpneg[i-1]+1
                else:
                    dpneg[i] = 0
            elif nums[i]<0:
                if dpneg[i-1]>0:
                    dppos[i] = dpneg[i-1]+1
                else:
                    dppos[i]=0
                dpneg[i] = dppos[i-1]+1
            else:
                dppos[i] = 0
                dpneg[i] = 0
        result = max(dppos)
        return result

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值