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
}
下一篇:
java语言案例设计猜数游戏
