📜  具有奇数乘积的子数组的计数(1)

📅  最后修改于: 2023-12-03 15:36:47.669000             🧑  作者: Mango

题目描述

给定一个长度为n的整数数组,计算其中具有奇数乘积的子数组的个数。

示例
Input: [1,2,3,4,5]
Output: 16
Explanation:
具有奇数乘积的子数组有:
[1], [1,2,3], [1,2,3,4,5], [2,3], [2,3,4,5], [3,4,5], [3], [3,4], [3,4,5], [4,5], [5], [1,5], [1,3,5], [2,5], [1,2,5], [1,2,3,5]
解法思路

对于每个数,考虑以当前数作为结尾的子数组有哪些,累加计算具有奇数乘积的子数组的数量。

具体而言,对于当前数,有两种情况:

  1. 当前数本身为奇数,以当前数结尾的子数组中有奇数个奇数,则该子数组乘积为奇数。以当前数结尾的子数组中有偶数个奇数,则该子数组乘积为偶数,不符合要求。
  2. 当前数为偶数,以当前数结尾的子数组中必须有两个及以上的奇数,才能保证子数组乘积为奇数。

用变量cnt统计以当前数结尾的子数组中奇数的个数,每读入一个数,根据以上两种情况更新cnt和答案即可。

代码实现
class Solution:
    def numberOfSubarrays(self, nums: List[int]) -> int:
        cnt = [0] * 2  # 以当前数结尾的子数组中奇数的个数
        ans = 0 
        for num in nums:
            if num % 2 == 1:
                cnt[0], cnt[1] = cnt[1], cnt[0]  # 奇数个数为cnt[1]
                cnt[1] += 1
                ans += cnt[1]
            else:
                ans += cnt[1]
        return ans
复杂度分析
  • 时间复杂度:$O(n)$,每个数仅会被遍历一次。
  • 空间复杂度:$O(1)$,仅使用常数个变量。