Given a binary array nums and an integer goal, return the number of non-empty subarrays with a sumgoal.
A subarray is a contiguous part of the array.
Example 1:
Input: nums = [1,0,1,0,1], goal = 2
Output: 4
Explanation: The 4 subarrays are bolded and underlined below:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
Example 2:
Input: nums = [0,0,0,0,0], goal = 0
Output: 15
Constraints:
1 <= nums.length <= 3 * 104
nums[i] is either 0 or 1.
0 <= goal <= nums.length
Solutions
Solution 1
Thinking
Count subarrays of a \(0/1\) array whose sum is \(\textit{goal}\). \(n\) is large, so enumerating intervals is too slow. When the prefix sum is \(s\), the number of earlier prefixes equal to \(s-\textit{goal}\) is the number of good subarrays ending here. A counter of prefix frequencies, starting at \(cnt[0]=1\), answers each step in \(O(1)\).
Method 1 uses linear extra space. Because the array is non-negative, the window sum is monotone in the left end. Two left pointers keep the first index whose sum exceeds \(\textit{goal}\) and the first whose sum is at least \(\textit{goal}\); their difference is the number of windows with sum exactly \(\textit{goal}\).