题目描述:
题解:
动态规划
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