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

题目链接:


思路

对于每一个前缀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
}
经验分享 程序员 微信小程序 职场和发展