> 文档中心 > LeetCode1567-乘积为正数的最长子数组

LeetCode1567-乘积为正数的最长子数组

题目链接:LC1567


思路

对于每一个前缀i,维护两个值,一个是当前有效前缀下,乘积为正的数组长度,一个是当前有效前缀下,乘积为负的数组长度。
有效前缀指不包含0,遇到0时,从0开始计数。

答案需要在规划过程中动态更新为最大的dp_pos值


当nums[i]>0时,
dp_pos[i]=dp_pos[i-1]+1
dp_neg[i]=(dp_neg[i-1]>0)?dp_neg[i-1]+1:0
当nums[i]<0时,
dp_pos[i]=(dp_neg[i-1]>0)?dp_neg[i-1]+1:0
dp_neg[i]=dp_pos[i-1]+1
当nums[i]==0时
dp_pos[i]=dp_neg[i]=0


代码Golang

func getMaxLen(nums []int) int {    p1,p2,n1,n2:=0,0,0,0    if nums[0]>0{p1++}else if nums[0]<0{n1++}    ans:=p1     for i:=1;i<len(nums);i++{ if nums[i]>0{     p2=p1+1     if n1>0{  n2=n1+1     }else{  n2=0     } }else if nums[i]<0{     if n1>0{  p2=n1+1     }else{  p2=0     }     n2=p1+1 }else{     p2,n2=0,0 } p1=p2 n1=n2 ans=max(ans,p1)    }    return ans}func max(i,j int)int{if i>j{return i}return j}