930. Binary Subarrays With Sum
We’ve got an array of 1s and 0s, and we need to find all the subarrays that sum to the goal provided. One would think a sliding window approach would work, but actually we want to use a prefix sum. We keep track of the current sum of the numbers we’ve seen, and index into a dictionary that keeps track of the number of times we’ve seen a particular sum. We add to the answer the number of times we’ve seen the current sum minus the goal - providing us with a number of subarrays that match that constraint.
The solution is as follows:
from collections import defaultdict
class Solution:
def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
prefix = defaultdict(int)
prefix[0] = 1
ans = curr = 0
for num in nums:
curr += num
ans += prefix[curr - goal]
prefix[curr] += 1
return ans
_ Time Complexity:
O(n) - We iterate through the input once.
_ Space Complexity:
O(n) - We maintain a dictionary of prefix sums.