1524. Die Anzahl der Unterarrays, deren Summe eine ungerade Zahl ist (C-Sprache ist leicht zu verstehen)

Sie erhalten ein ganzzahliges Array arr. Bitte geben Sie die Anzahl der Subarrays zurück, deren Summe eine ungerade Zahl ist.

Da die Antwort sehr groß sein kann, geben Sie das Ergebnis bitte nach Modulo 10^9 + 7 zurück.

Beispiel 1:

Eingabe: arr = [1,3,5]
Ausgabe: 4
Erläuterung: Alle Unterarrays sind [[1],[1,3],[1,3,5],[3],[3,5], [5 ]].
Die Summe aller Subarrays ist [1,4,9,3,8,5].
Die ungerade Summe enthält [1,9,3,5], also ist die Antwort 4.
Beispiel 2:

Eingabe: arr = [2,4,6]
Ausgabe: 0
Erläuterung: Alle Subarrays sind [[2],[2,4],[2,4,6],[4],[4,6],[ 6 ]] .
Die Summe aller Subarrays ist [2,6,12,4,10,6].
Alle Subarray-Summen sind gerade, daher ist die Antwort 0.
Beispiel 3:

Eingabe: arr = [1,2,3,4,5,6,7]
Ausgabe: 16
Beispiel 4:

Eingabe: arr = [100,100,99,99]
Ausgabe: 4
Beispiel 5:

Eingabe: arr = [7]
Ausgabe: 1

Analyse: Diese Frage untersucht dynamische Programmierung + Array

Zuerst müssen wir wissen, dass ungerade + ungerade = gerade und ungerade + gerade = ungerade. Wir können den Bitoperator verwenden, um zu beurteilen, (arr [i] & 1) == 1, wenn es wahr ist, dann ist es eine ungerade Zahl, andernfalls ist es falsch.

int numOfSubarrays(int* arr, int n){
    int MOD=(int) 1e9+7;
    int odd=0,even=0,cnt=0;
        for(int i=0;i<n;i++){
              // odd 表示以当前元素 k 结尾和为奇数子数组数目
            // even 表示以当前元素 k 结尾和为偶数子数组数目
            if((arr[i]& 1) == 1){
                int t = odd;
                // 偶数 + 奇数k = 奇数              
                odd = even + 1; // k 为奇数,  {k, 偶数1+k, 偶数2 + k, ...}
                even = t;       // 奇数 + 奇数k = 偶数
            }else{
                even++;  // k 为偶数,  {k, 偶数1+k, 偶数2 + k, ...}
            }

            cnt = (cnt + odd) % MOD; 
    }
  return cnt;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/124261441
Recomendado
Clasificación