Binary Subarrays With Sum

medium prefix sum hash map sliding window

Problem

Given a binary array nums and an integer goal, return the number of non-empty subarrays with a sum equal to goal. A subarray is a contiguous part of the array.

Inputnums = [1, 0, 1, 0, 1], goal = 2
Output4
The four subarrays summing to 2 are [1,0,1], [1,0,1,0], [0,1,0,1] and [1,0,1] (indices 2..4).

def num_subarrays_with_sum(nums, goal):
    count = {0: 1}
    prefix = 0
    total = 0
    for x in nums:
        prefix += x
        total += count.get(prefix - goal, 0)
        count[prefix] = count.get(prefix, 0) + 1
    return total
function numSubarraysWithSum(nums, goal) {
  const count = new Map([[0, 1]]);
  let prefix = 0, total = 0;
  for (const x of nums) {
    prefix += x;
    total += count.get(prefix - goal) || 0;
    count.set(prefix, (count.get(prefix) || 0) + 1);
  }
  return total;
}
class Solution {
    public int numSubarraysWithSum(int[] nums, int goal) {
        Map<Integer, Integer> count = new HashMap<>();
        count.put(0, 1);
        int prefix = 0, total = 0;
        for (int x : nums) {
            prefix += x;
            total += count.getOrDefault(prefix - goal, 0);
            count.merge(prefix, 1, Integer::sum);
        }
        return total;
    }
}
int numSubarraysWithSum(vector<int>& nums, int goal) {
    unordered_map<int, int> count;
    count[0] = 1;
    int prefix = 0, total = 0;
    for (int x : nums) {
        prefix += x;
        if (count.count(prefix - goal)) total += count[prefix - goal];
        count[prefix]++;
    }
    return total;
}
Time: O(n) Space: O(n)