# 2750. Ways to Split Array Into Good Subarrays

## Description

You are given a binary array nums.

A subarray of an array is good if it contains exactly one element with the value 1.

Return an integer denoting the number of ways to split the array nums into good subarrays. As the number may be too large, return it modulo 109 + 7.

A subarray is a contiguous non-empty sequence of elements within an array.

Example 1:

Input: nums = [0,1,0,0,1]
Output: 3
Explanation: There are 3 ways to split nums into good subarrays:
- [0,1] [0,0,1]
- [0,1,0] [0,1]
- [0,1,0,0] [1]


Example 2:

Input: nums = [0,1,0]
Output: 1
Explanation: There is 1 way to split nums into good subarrays:
- [0,1,0]


Constraints:

• 1 <= nums.length <= 105
• 0 <= nums[i] <= 1

## Solutions

• class Solution {
public int numberOfGoodSubarraySplits(int[] nums) {
final int mod = (int) 1e9 + 7;
int ans = 1, j = -1;
for (int i = 0; i < nums.length; ++i) {
if (nums[i] == 0) {
continue;
}
if (j > -1) {
ans = (int) ((long) ans * (i - j) % mod);
}
j = i;
}
return j == -1 ? 0 : ans;
}
}

• class Solution {
public:
int numberOfGoodSubarraySplits(vector<int>& nums) {
const int mod = 1e9 + 7;
int ans = 1, j = -1;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] == 0) {
continue;
}
if (j > -1) {
ans = 1LL * ans * (i - j) % mod;
}
j = i;
}
return j == -1 ? 0 : ans;
}
};

• class Solution:
def numberOfGoodSubarraySplits(self, nums: List[int]) -> int:
mod = 10**9 + 7
ans, j = 1, -1
for i, x in enumerate(nums):
if x == 0:
continue
if j > -1:
ans = ans * (i - j) % mod
j = i
return 0 if j == -1 else ans


• func numberOfGoodSubarraySplits(nums []int) int {
const mod int = 1e9 + 7
ans, j := 1, -1
for i, x := range nums {
if x == 0 {
continue
}
if j > -1 {
ans = ans * (i - j) % mod
}
j = i
}
if j == -1 {
return 0
}
return ans
}

• function numberOfGoodSubarraySplits(nums: number[]): number {
let ans = 1;
let j = -1;
const mod = 10 ** 9 + 7;
const n = nums.length;
for (let i = 0; i < n; ++i) {
if (nums[i] === 0) {
continue;
}
if (j > -1) {
ans = (ans * (i - j)) % mod;
}
j = i;
}
return j === -1 ? 0 : ans;
}


• public class Solution {
public int NumberOfGoodSubarraySplits(int[] nums) {
long ans = 1, j = -1;
int mod = 1000000007;
int n = nums.Length;
for (int i = 0; i < n; ++i) {
if (nums[i] == 0) {
continue;
}
if (j > -1) {
ans = ans * (i - j) % mod;
}
j = i;
}
return j == -1 ? 0 : (int) ans;
}
}