【LeetCode-204】1567. 乘积为正数的最长子数组长度

【中等】1567. 乘积为正数的最长子数组长度

递归是一种特殊的DP

思路1:(不推荐)

暴力:枚举所有的子数组,计算其结果是否为正。但是复杂度为n2,所以要进行优化

思路2:(推荐)

因为要求结果为正的最长数组的长度,所以不妨从末尾出发向前递推到符合条件的最长子数组

  1. 分情况讨论ai的正负,长度为
以a[i-1]结尾的最长子数组+1

其中f(n)/g(n)表示以a[n]结尾的,结果为正/负的最长子数组的长度。所以f(n)/g(n)的值一定大于等于0,因为是长度。

可得如下表格:

第i个元素的大小(ai) f(n) g(n)
ai > 0 f[i] = f[i-1]+1 g[i] = g[i-1]+1
ai = 0 f[i] = 0 g[i] = 0
ai < 0 f[i] = g[i-1]+1 g[i] = f[i-1]+1
  1. 但是要注意a[i-1]的正负
    边界问题:若第i-1个元素为0
g[i] = g[i-1]+1;	//不符合条件,因为0+a[i](正数)不能得到结尾为负的最长子数组
f[i] = g[i-1]+1;	//不符合条件,因为0+a[i](负数)不能得到结尾为负的最长子数组

所以标黄部分要进行“是否存在以a[i-1]结尾的最长子数组”判断,即if(g[i-1]>0)

代码:

class Solution 
{
   
public
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值