xinyu04

导航

LeetCode 1524 Number of Sub-arrays With Odd Sum 思维

Given an array of integers arr, return the number of subarrays with an odd sum.

Since the answer can be very large, return it modulo \(10^9 + 7\).

Solution

注意 \(subarray\) 是连续的序列。注意的一点是: \(\text{odd+odd/even+even = even}\),因此只有当奇偶性相反时,才有可能是奇数和。

我们只关心奇偶性,因此可以利用位运算。具体来说,我们可以用

\[arr[i]\& 1 \]

来得到当前元素的奇偶性:\(1:\text{odd};0:\text{even}\). 我们用 \(count[0/1]\) 来统计前缀和为偶数或奇数的数量。那么如何更新结果呢?我们获得了当前元素的奇偶性 \(\text{fg}\),利用 \(\text{XOR}\) 来判断与前面序列的奇偶性是否一致 \(cur\):如果不一致则为 \(1\),否则为 \(0\).
可以发现,不论哪种情况,我们都可以归结为:

\[res = (res+count[1-cur])\ \%\text{ MOD} \]

点击查看代码
class Solution {
private:
    int res = 0, cur = 0;    
    int MOD = int(1e9+7);
    int count[2]={1,0};
public:
    int numOfSubarrays(vector<int>& arr) {
        int n = arr.size();

        if(n==1 && arr[0]%2==1)return 1;
        if(n==1 && arr[0]%2==0)return 0;
        for(int i=0;i<n;i++){
            int fg = arr[i]&1;// odd 1 or even 0
            cur ^= fg;// both odd/even or not
            // same: 0(odd+odd/even+even) not: 1(odd+even)
            res = (res + count[1-cur])%MOD;
            //cout<<res<<endl;
            count[cur]++;
        }
        return res;
    }
};

posted on 2022-05-30 15:52  Blackzxy  阅读(22)  评论(0编辑  收藏  举报