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

题目描述

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

思路分析

解法一:动态规划(推荐)

核心思路

  • pos 表示以当前位置结尾乘积为正的最长长度。
  • neg 表示以当前位置结尾乘积为负的最长长度。
  • 根据当前数正负更新 pos/neg


复杂度分析

  • 时间复杂度:O(n),其中 n 表示数组长度。
  • 空间复杂度:O(1)。
class Solution {
    public int getMaxLen(int[] nums) {
        int pos = 0;
        int neg = 0;
        int best = 0;

        for (int x : nums) {
            if (x > 0) {
                pos = pos + 1;
                neg = neg == 0 ? 0 : neg + 1;
            } else if (x < 0) {
                int newPos = neg == 0 ? 0 : neg + 1;
                int newNeg = pos + 1;
                pos = newPos;
                neg = newNeg;
            } else {
                pos = 0;
                neg = 0;
            }
            best = Math.max(best, pos);
        }

        return best;
    }
}
func getMaxLen(nums []int) int {
	pos, neg := 0, 0
	best := 0

	for _, x := range nums {
		if x > 0 {
			pos = pos + 1
			if neg == 0 {
				neg = 0
			} else {
				neg = neg + 1
			}
		} else if x < 0 {
			newPos := 0
			if neg != 0 {
				newPos = neg + 1
			}
			newNeg := pos + 1
			pos, neg = newPos, newNeg
		} else {
			pos, neg = 0, 0
		}

		if pos > best {
			best = pos
		}
	}

	return best
}

相似题目

题目 难度 考察点
1567. 乘积为正数的最长子数组长度 中等 DP
152. 乘积最大子数组 中等 DP
1186. 删除一次得到子数组最大和 中等 DP
53. 最大子数组和 简单 DP
1749. 任意子数组和的绝对值的最大值 中等 前缀和
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/78032657
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!