加载中...
1567-乘积为正数的最长子数组长度(Maximum Length of Subarray With Positive Product)
发表于:2021-12-03 | 分类: 中等
字数统计: 882 | 阅读时长: 4分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/maximum-length-of-subarray-with-positive-product

英文原文

Given an array of integers nums, find the maximum length of a subarray where the product of all its elements is positive.

A subarray of an array is a consecutive sequence of zero or more values taken out of that array.

Return the maximum length of a subarray with positive product.

 

Example 1:

Input: nums = [1,-2,-3,4]
Output: 4
Explanation: The array nums already has a positive product of 24.

Example 2:

Input: nums = [0,1,-2,-3,-4]
Output: 3
Explanation: The longest subarray with positive product is [1,-2,-3] which has a product of 6.
Notice that we cannot include 0 in the subarray since that'll make the product 0 which is not positive.

Example 3:

Input: nums = [-1,-2,-3,0,1]
Output: 2
Explanation: The longest subarray with positive product is [-1,-2] or [-2,-3].

Example 4:

Input: nums = [-1,2]
Output: 1

Example 5:

Input: nums = [1,2,3,5,-6,4,0,10]
Output: 4

 

Constraints:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

中文题目

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

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

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

 

示例  1:

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

示例 2:

输入:nums = [0,1,-2,-3,-4]
输出:3
解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。
注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。

示例 3:

输入:nums = [-1,-2,-3,0,1]
输出:2
解释:乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3] 。

示例 4:

输入:nums = [-1,2]
输出:1

示例 5:

输入:nums = [1,2,3,5,-6,4,0,10]
输出:4

 

提示:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

通过代码

高赞题解

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

知识点:递推

设 POS[i] 是以 nums[i] 结尾,乘积为正的最长子数组的长度。

设 NEG[i] 是以 nums[i] 结尾,乘积为负的最长子数组的长度。

为了编写代码方便,设 nums 下标从 1 开始。那么 POS[0] = NEG[0] = 0。

接下来讨论一下 nums[i] 的值如何影响 POS[i] 及 NEG[i] 的计算。

  • 当 nums[i] 为 0 时,显然有 POS[i] = NEG[i] = 0,即这样的子数组不存在。
  • 当 nums[i] 为正时:
    • POS[i] = POS[i-1] + 1。
    • NEG[i] = NEG[i-1] ? (NEG[i-1] + 1) : 0。
    • 为何计算NEG[i]时要判断 NEG[i-1] 不为 0 ?因为 nums[i] 自己没法成为一个乘积为负的数组。
  • 当 nums[i] 为负时:
    • POS[i] = NEG[i-1] ? (NEG[i-1] + 1) : 0。 判断 NEG[i-1] 是否为 0 的原因同上。
    • NEG[i] = POS[i-1] + 1;
int dp[100001][2]; // dp[i][0] 即 POS,dp[i][1] 即 NEG。
class Solution {
public:
    int getMaxLen(vector<int>& nums) {
        dp[0][0] = dp[0][1] = 0;
        int anw = 0;
        for(int i = 1; i <= nums.size(); i++) {
            if(nums[i-1] == 0) {
                dp[i][0] = 0;
                dp[i][1] = 0;
            } else if(nums[i-1] > 0) {
                dp[i][0] = dp[i-1][0] + 1;
                dp[i][1] = dp[i-1][1] ? (dp[i-1][1] + 1) : 0;
            } else {
                dp[i][0] = dp[i-1][1] ? (dp[i-1][1] + 1) : 0;
                dp[i][1] = dp[i-1][0] + 1;
            }
            
            anw = max(anw, dp[i][0]);
        }
        return anw;
    }
};

image.png

如果感觉有点意思,那就关注一下【我的公众号】吧~

统计信息

通过次数 提交次数 AC比率
16028 39455 40.6%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1566-重复至少 K 次且长度为 M 的模式(Detect Pattern of Length M Repeated K or More Times)
下一篇:
1568-使陆地分离的最少天数(Minimum Number of Days to Disconnect Island)
本文目录
本文目录