1567. 乘积为正数的最长子数组长度 dp

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

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

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

示例  1:

输入:nums = [1,-2,-3,4]
输出:4
解释:数组本身乘积就是正数,值为 24 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-subarray-with-positive-product
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:递归,
dp[i][0] : 乘积为负的最长子数组的长度
dp[i][1] : 乘积为正的最长子数组的长度
遍历数组中的数字,对于每个数字,根据其>0,=0,<0进行不同处理

class Solution {
public:
    int getMaxLen(vector<int>& nums) {
        int dp[100005][2];

        // dp[i][0] : 乘积为负的最长子数组的长度
        // dp[i][1] : 乘积为正的最长子数组的长度
        int ans = 0;

        dp[0][0] = dp[0][1] = 0;
        for (int i = 1; i <= nums.size(); i++) {
            if (nums[i - 1] == 0) {
                dp[i][0] = dp[i][1] = 0;
            }
            else
            if (nums[i - 1] > 0) {
                dp[i][1] = dp[i -1][1] + 1;
                dp[i][0] = dp[i - 1][0] ? (dp[i - 1][0] + 1) : 0;
            }
            else
            if (nums[i - 1] < 0) {
                dp[i][0] = dp[i - 1][1] + 1;
                dp[i][1] = dp[i - 1][0] ? (dp[i - 1][0] + 1) : 0;
            }
            ans = max(ans, dp[i][1]);
        }

        return ans;
    }
};
posted @ 2020-09-07 09:47  _西瓜不甜  阅读(280)  评论(0编辑  收藏  举报