1. 程式人生 > 其它 >LeetCode 1524 Number of Sub-arrays With Odd Sum 思維

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;
    }
};