1524 和为奇数的子数组数目

该博客介绍了如何通过前缀和技巧解决编程问题,即计算整数数组中和为奇数的子数组数量。提供两种不同的解决方案,方法1和方法2,均减少了内存消耗,对数组遍历并根据当前和的奇偶性更新结果。通过这种方法,可以高效地求解大数组下的子数组奇偶性计数,并对结果进行取模操作,以适应大数值的处理。

题目描述:
给你一个整数数组 arr 。请你返回和为 奇数 的子数组数目。
由于答案可能会很大,请你将结果对 10^9 + 7 取余后返回。

示例 1:
输入:arr = [1,3,5]
输出:4
解释:所有的子数组为 [[1],[1,3],[1,3,5],[3],[3,5],[5]] 。
所有子数组的和为 [1,4,9,3,8,5].
奇数和包括 [1,9,3,5] ,所以答案为 4 。

示例 2 :
输入:arr = [2,4,6]
输出:0
解释:所有子数组为 [[2],[2,4],[2,4,6],[4],[4,6],[6]] 。
所有子数组和为 [2,6,12,4,10,6] 。
所有子数组和都是偶数,所以答案为 0 。

示例 3:
输入:arr = [1,2,3,4,5,6,7]
输出:16

示例 4:
输入:arr = [100,100,99,99]
输出:4

示例 5:
输入:arr = [7]
输出:1

提示:
1 <= arr.length <= 10^5
1 <= arr[i] <= 100

方法1:
主要思路:解题链接汇总
(1)使用前缀和,统计前缀和中的偶数的个数,和根据当前位置的前缀和的奇偶性,据定当前位置新增的和为奇数的子数组的数目;

class Solution {
public:
    int numOfSubarrays(vector<int>& arr) {
        if(arr.empty()){
            return 0;
        }
        vector<int> sum_pre(arr.size()+1,0);
        for(int i=0;i<arr.size();++i){
            sum_pre[i+1]=sum_pre[i]+arr[i];
        }
        long res=0;
        int cur_even=1;
        for(int i=1;i<sum_pre.size();++i){
            if(sum_pre[i]&1){
                res+=cur_even;
            }
            else{
                res+=i-cur_even;
                ++cur_even;
            }
        }
        return res%1000000007;
    }
};

方法2:
主要思路:
(1)思路和方法1类型,只是减少了前缀和数组的使用,减少内存的消耗

class Solution {
public:
    int numOfSubarrays(vector<int>& arr) {
        long res=0;
        int cur_even=1;
        int cur_sum=0;
        for(int i=0;i<arr.size();++i){
            cur_sum+=arr[i];
            if(cur_sum&1){
                res+=cur_even;
            }
            else{
                res+=i-cur_even+1;
                ++cur_even;
            }
        }
        return res%1000000007;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值