Number of Sub-arrays With Odd Sum – LeetCode
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 109 + 7
.
Example 1:
Input: arr = [1,3,5] Output: 4 Explanation: All subarrays 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 subarrays 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
Constraints:
1 <= arr.length <= 105
1 <= arr[i] <= 100
class Solution:
def numOfSubarrays(self, arr: List[int]) -> int:
n = len(arr)
odd = [0] * n
# sum of all subarray ending with arr[i] = sum of all subarray ending with arr[i - 1] + arr[i]
# count of subarrays ending with arr[i]: dp[i] = dp[i - 1] + 1. so we don't have to use an array, just constant number can do
dic = {}
dp = 1
odd[0] = 1 if arr[0] % 2 == 1 else 0
for i in range(1, n):
if arr[i] % 2 == 1:
odd[i] += dp - odd[i - 1] + 1
else:
odd[i] += odd[i - 1]
dp += 1
return sum(odd) % 1000000007