📅  最后修改于: 2023-12-03 15:36:47.880000             🧑  作者: Mango
给定一个整数数组,我们可以通过取连续的数字子序列,计算它们的乘积。例如,给定数组 [2, 3, -2, 4]
,可以取子序列 [2, 3]
,取乘积得到 6
,或取子序列 [2, 3, -2, 4]
取乘积得到 -48
,取子序列 [4]
取乘积得到 4
。
本题要求求解最长的具有正积的连续子序列的长度。
我们可以使用动态规划来解决这个问题。对于位置i,我们可以考虑模仿最长子序列的做法,维护两个变量:
这样我们可以在遍历数组时递推得到$f_i$和$g_i$,最终答案即为$max_{1<=i<=n}[f_i]$。
$f_i=(f_{i-1}+1)\times sign(nums[i])$
$g_i=(g_{i-1}+1)\times sign(nums[i])$
其中$sign$表示取数的符号,如果为正数返回1,如果为负数返回-1,如果为0返回0.
$f_i=(g_{i-1}+1)\times sign(nums[i])$
$g_i=(f_{i-1}+1)\times sign(nums[i])$
具体实现代码如下:
class Solution:
def getMaxLen(self, nums: List[int]) -> int:
n = len(nums)
if n == 0:
return 0
f, g = 0, 0
res = 0
for num in nums:
if num > 0:
f += 1
g = g + 1 if g else 0
elif num < 0:
f, g = g + 1 if g else 0, f + 1
else:
f, g = 0, 0
res = max(res, f)
return res
对于一个长度为n的数组,我们需要对其进行一次遍历,所以时间复杂度为O(n)。
我们只需要使用常数个变量来存储f和g,所以空间复杂度为O(1)。