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}