列表

详情


2495. 乘积为偶数的子数组数

给定一个整数数组 nums,返回具有偶数乘积的 nums 子数组的数目

子数组 是数组中连续的非空元素序列。

 

示例 1:

输入: nums = [9,6,7,13]
输出: 6
解释: 有6个子数组的乘积是偶数:
- nums[0..1] = 9 * 6 = 54.
- nums[0..2] = 9 * 6 * 7 = 378.
- nums[0..3] = 9 * 6 * 7 * 13 = 4914.
- nums[1..1] = 6.
- nums[1..2] = 6 * 7 = 42.
- nums[1..3] = 6 * 7 * 13 = 546.

示例 2:

输入: nums = [7,3,5]
输出: 0
解释: 没有乘积是偶数的子数组

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long evenProduct(vector<int>& nums) { } };

php 解法, 执行用时: 192 ms, 内存消耗: 31 MB, 提交时间: 2023-10-21 20:35:02

class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function evenProduct($nums) {
        // 一个重要的性质是: 只有奇数*奇数 才是奇数,否则都是偶数
        // 如果位置i是偶数,那以其结尾的都是偶数
        // 否则,以其结尾的偶数个数 = 前一个位置作为结尾的偶数个数
        $result = 0;

        // 当前位置结尾的偶数积个数
        $now = 0;
        $n = count($nums);
        for ($i = 0; $i < $n; $i++) {
            if ($nums[$i] & 1) { // 奇数,与前一个相同
                
            } else { // 偶数,与前面所有组合都可以
                $now = $i + 1;
            }
            
            $result += $now;
        }
        
        return $result;
    }
}

rust 解法, 执行用时: 8 ms, 内存消耗: 3.3 MB, 提交时间: 2023-10-21 20:34:45

impl Solution {
    pub fn even_product(nums: Vec<i32>) -> i64 {
        let mut ans = 0;
        let mut cnt = 0;
        let n = nums.len();

        for i in 0..n {
            if nums[i] & 1 == 0 {
                cnt = i as i64  + 1;
            }

            ans += cnt;
        }

        ans
    }
}

java 解法, 执行用时: 4 ms, 内存消耗: 57.7 MB, 提交时间: 2023-10-21 20:34:22

class Solution {
    public long evenProduct(int[] nums) {
        int left = -1;
        long sum = 0;
        for (int i = 0; i < nums.length; i++) {
            // 偶数匹配所有值,并刷新左端点
            if (nums[i] % 2 == 0) {
                sum += i + 1;
                left = i;
            }
            // 奇数找到最近的偶数进行配对,加入最近偶数之前的所有值
            else {
                sum += left + 1;
            }
        }
        return sum;
    }
}

python3 解法, 执行用时: 84 ms, 内存消耗: 27.5 MB, 提交时间: 2023-10-21 20:34:07

class Solution:
    def evenProduct(self, nums: List[int]) -> int:
        ans,lst,n = 0,-1,len(nums)
        for i in range(n):
            if not nums[i] & 1:
                lst = i
            ans += lst + 1
        return ans
        
    def evenProduct2(self, nums: List[int]) -> int:
        # 定义状态表示数组dp, 其中的元素为一个二元组
        # dp[i][0]表示以nums[i]结尾的乘积为偶数的数组数量
        # dp[i][1]表示以nums[i]结尾的乘积为奇数的数组数量
        # 若当前nums[i]为奇数,则可以与nums[i - 1]结尾的乘积为偶数的数组组合
        # 所以dp[i][0] = dp[i - 1][0], dp[i][1] = dp[i - 1] + 1(可以和nums[i - 1]结尾的组合成乘积为奇数的数组,包括自己)
        
        # nums[i]为偶数时, 则可以和以nums[i - 1]结尾的任何数组组合为乘积为偶数的数组
        # dp[i][0] = i + 1 (包括自己)
        # 无法组合成乘积为奇数的数组 dp[i][1] = 0

        # 每个dp[i]都只依赖与dp[i - 1],所以可以使用滚动数组优化
        a = b = ans = 0
        for i, n in enumerate(nums, start = 1):
            if n & 1:
                b += 1
            else:
                a = i
                b = 0
            ans += a
        
        return ans

上一题