📅  最后修改于: 2023-12-03 15:07:05.751000             🧑  作者: Mango
给定一个整数序列,计算其乘积为复合数的所有子序列的个数。
首先,我们需要知道什么是复合数。一个大于 1 的正整数如果它不是质数,则称它为复合数。
我们可以使用动态规划的思路来解决这个问题。对于序列中的每个位置 i,我们记录两个值:
对于 pos[i] 的计算,我们可以依次枚举前 i-1 个数中的每一个位置 j,如果 nums[i] 是正数,pos[i] 可以由 pos[j] 乘上 nums[i] 得到;如果 nums[i] 是负数,则 pos[i] 可以由 neg[j] 乘上 nums[i] 得到。
对于 neg[i] 的计算,同理可以依次枚举前 i-1 个数中的每一个位置 j,如果 nums[i] 是正数,neg[i] 可以由 neg[j] 乘上 nums[i] 得到;如果 nums[i] 是负数,则 neg[i] 可以由 pos[j] 乘上 nums[i] 得到。
最终,答案就是 pos[n](其中 n 是序列的长度)。
以下是 Python 代码实现:
def composite_subsequence_count(nums):
n = len(nums)
pos = [0] * (n + 1)
neg = [0] * (n + 1)
ans = 0
for i in range(1, n+1):
if nums[i-1] == -1:
pos[i] = neg[i-1]
neg[i] = pos[i-1]
elif nums[i-1] > 0:
pos[i] = pos[i-1] + 1
neg[i] = neg[i-1] if neg[i-1] else 0
else:
pos[i] = neg[i-1] if neg[i-1] else 0
neg[i] = pos[i-1] + 1
ans += pos[i]
return ans
时间复杂度:$O(n)$,其中 n 是序列的长度。
空间复杂度:$O(n)$。