Number of Sub-arrays With Odd Sum

Given an array of integers arr. Return the number of sub-arrays with odd sum.

As the answer may grow large, the answer must be computed modulo 10^9 + 7.

Example 1:

Input: arr = [1,3,5]
Output: 4
Explanation: All sub-arrays are [[1],[1,3],[1,3,5],[3],[3,5],[5]]
All sub-arrays sum are [1,4,9,3,8,5].
Odd sums are [1,9,3,5] so the answer is 4.

Example 2:

Input: arr = [2,4,6]
Output: 0
Explanation: All sub-arrays are [[2],[2,4],[2,4,6],[4],[4,6],[6]]
All sub-arrays sum are [2,6,12,4,10,6].
All sub-arrays have even sum and the answer is 0.

Example 3:

Input: arr = [1,2,3,4,5,6,7]
Output: 16

Example 4:

Input: arr = [100,100,99,99]
Output: 4

Example 5:

Input: arr = [7]
Output: 1

Constraints:

  • 1 <= arr.length <= 10^5

  • 1 <= arr[i] <= 100

class Solution {
    long mod = 1_000_000_007;

    public int numOfSubarrays(int[] arr) {
        // Map of odd sum and even sum -> frequency
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        map.put(1, 0);
        long count = 0;
        long sum = 0;
        for (int x : arr) {
            sum += x;
            if (sum % 2 == 0) {
                count = (count + map.get(1)) % mod;
                map.put(0, map.get(0) + 1);
            } else {
                count = (count + map.get(0)) % mod;
                map.put(1, map.get(1) + 1);
            }
        }
        return (int) count;
    }
}

Last updated