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

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

题目描述:

给你一个整数数组 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] 。

提示:

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

思路:

时间复杂度:O(n),空间复杂度O(1)

分类讨论正负数两种情况

代码:

func getMaxLen(nums []int) int {
    var dp1,dp2,res int
    n := len(nums)
    for i:=0;i<n;i++{
        if nums[i] >0{
            if dp2 >0{
                dp2 ++
            }
            dp1 +=1
        }else if nums[i] <0{
            a,b := dp1,dp2
            if b >0 {
                dp1 = b+1
            }else {
                dp1 = 0
            }
            dp2 = a+1
        }else{
            dp1,dp2 = 0,0
        }
        res = max(res,dp1)
    }
    return res
}

func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}

代码效率:

执行用时:92 ms, 在所有 Go 提交中击败了12.05%的用户
内存消耗:9.7 MB, 在所有 Go 提交中击败了83.13%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!