递归是一种特殊的DP
思路1:(不推荐)
暴力:枚举所有的子数组,计算其结果是否为正。但是复杂度为n2,所以要进行优化
思路2:(推荐)
因为要求结果为正的最长数组的长度,所以不妨从末尾出发向前递推到符合条件的最长子数组
- 分情况讨论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 |
- 但是要注意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