LeedCode刷题:1567.乘积为正数的最长子数组的长度

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。

一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。

请你返回乘积为正数的最长子数组长度。

动态规划求解,根据当前元素来填正负dp表的状态

 1 class Solution {
 2 public:
 3 /* 初始化 pos[0] 和 neg[0]
 4 1.遍历数组,若当前元素为正,那么:
 5   pos[i] 为 pos[i-1] + 1,
 6   如果 neg[i-1] > 0,即:以 nums[i-1] 结尾,乘积为负的数组存在,那么 neg[i] 为 neg[i-1] + 1;否则,neg[i] 为 0(因为当前元素也为正,没有乘积为负的数组)
 7 2.若当前元素为负,那么:
 8   如果 neg[i-1] > 0,那么 pos[i] 为 neg[i-1] + 1,否则,pos[i] 为 0
 9   neg[i] 为 pos[i-1] + 1
10   更新乘积为正数的数组最大长度 ans */
11     int getMaxLen(vector<int>& nums) {
12         vector<int> dpPos(nums.size()+1,0);
13         vector<int> dpNeg(nums.size()+1,0);
14         int res=0;
15         for(int i=1;i<dpPos.size();i++){
16             if(nums[i-1]>0){
17                 dpPos[i]=dpPos[i-1]+1;
18                 dpNeg[i]=dpNeg[i-1]>0?dpNeg[i-1]+1:0;//因为 nums[i] 自己没法成为一个乘积为负的数组。
19             }
20             else if(nums[i-1]<0){
21                 dpPos[i]=dpNeg[i-1]>0?dpNeg[i-1]+1:0;//因为 nums[i] 自己没法成为一个乘积为正的数组。
22                 dpNeg[i]=dpPos[i-1]+1;
23             }
24             else{
25                 dpPos[i]=0;
26                 dpNeg[i]=0;
27             }
28             res=max(dpPos[i],res);
29         }
30         return res;
31     }
32 };
原文地址:https://www.cnblogs.com/nilbook/p/13593993.html