Welcome to Subscribe On Youtube

930. Binary Subarrays With Sum

Description

Given a binary array nums and an integer goal, return the number of non-empty subarrays with a sum goal.

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: Hash Table

We can use an array or hash table $cnt$ to record the number of occurrences of each prefix sum, where $cnt[i]$ represents the number of subarrays whose prefix sum is $i$. Initially $cnt[0] = 1$.

Next, we traverse the array nums and use the variable $s$ to maintain the current prefix sum. For each $s$, we can calculate the number of occurrences of $s - goal$, which is the number of subarrays that meet the conditions ending at the current position, and add them to the answer. Then we add $1$ to the count value of $s$.

The final answer is the number of subarrays that meet the condition.

Time complexity $O(n)$, space complexity $O(n)$. Where $n$ is the length of the array nums.

Solution 2

This implementation follows the required operations directly. It traverses the relevant values and updates its state as each value is processed. After all required states have been considered, the maintained result is returned.

  • class Solution {
        public int numSubarraysWithSum(int[] nums, int goal) {
            int i1 = 0, i2 = 0, s1 = 0, s2 = 0, j = 0, ans = 0;
            int n = nums.length;
            while (j < n) {
                s1 += nums[j];
                s2 += nums[j];
                while (i1 <= j && s1 > goal) {
                    s1 -= nums[i1++];
                }
                while (i2 <= j && s2 >= goal) {
                    s2 -= nums[i2++];
                }
                ans += i2 - i1;
                ++j;
            }
            return ans;
        }
    }
    
    
    // Solution 2
    class Solution {
        public int numSubarraysWithSum(int[] nums, int goal) {
            int i1 = 0, i2 = 0, s1 = 0, s2 = 0, j = 0, ans = 0;
            int n = nums.length;
            while (j < n) {
                s1 += nums[j];
                s2 += nums[j];
                while (i1 <= j && s1 > goal) {
                    s1 -= nums[i1++];
                }
                while (i2 <= j && s2 >= goal) {
                    s2 -= nums[i2++];
                }
                ans += i2 - i1;
                ++j;
            }
            return ans;
        }
    }
    
    
  • class Solution {
    public:
        int numSubarraysWithSum(vector<int>& nums, int goal) {
            int i1 = 0, i2 = 0, s1 = 0, s2 = 0, j = 0, ans = 0;
            int n = nums.size();
            while (j < n) {
                s1 += nums[j];
                s2 += nums[j];
                while (i1 <= j && s1 > goal) s1 -= nums[i1++];
                while (i2 <= j && s2 >= goal) s2 -= nums[i2++];
                ans += i2 - i1;
                ++j;
            }
            return ans;
        }
    };
    
    
    // Solution 2
    class Solution {
    public:
        int numSubarraysWithSum(vector<int>& nums, int goal) {
            int i1 = 0, i2 = 0, s1 = 0, s2 = 0, j = 0, ans = 0;
            int n = nums.size();
            while (j < n) {
                s1 += nums[j];
                s2 += nums[j];
                while (i1 <= j && s1 > goal) s1 -= nums[i1++];
                while (i2 <= j && s2 >= goal) s2 -= nums[i2++];
                ans += i2 - i1;
                ++j;
            }
            return ans;
        }
    };
    
    
  • class Solution:
        def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
            i1 = i2 = s1 = s2 = j = ans = 0
            n = len(nums)
            while j < n:
                s1 += nums[j]
                s2 += nums[j]
                while i1 <= j and s1 > goal:
                    s1 -= nums[i1]
                    i1 += 1
                while i2 <= j and s2 >= goal:
                    s2 -= nums[i2]
                    i2 += 1
                ans += i2 - i1
                j += 1
            return ans
    
    
    # Solution 2
    class Solution:
        def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
            i1 = i2 = s1 = s2 = j = ans = 0
            n = len(nums)
            while j < n:
                s1 += nums[j]
                s2 += nums[j]
                while i1 <= j and s1 > goal:
                    s1 -= nums[i1]
                    i1 += 1
                while i2 <= j and s2 >= goal:
                    s2 -= nums[i2]
                    i2 += 1
                ans += i2 - i1
                j += 1
            return ans
    
    
  • func numSubarraysWithSum(nums []int, goal int) int {
    	i1, i2, s1, s2, j, ans, n := 0, 0, 0, 0, 0, 0, len(nums)
    	for j < n {
    		s1 += nums[j]
    		s2 += nums[j]
    		for i1 <= j && s1 > goal {
    			s1 -= nums[i1]
    			i1++
    		}
    		for i2 <= j && s2 >= goal {
    			s2 -= nums[i2]
    			i2++
    		}
    		ans += i2 - i1
    		j++
    	}
    	return ans
    }
    
    
    // Solution 2
    func numSubarraysWithSum(nums []int, goal int) int {
    	i1, i2, s1, s2, j, ans, n := 0, 0, 0, 0, 0, 0, len(nums)
    	for j < n {
    		s1 += nums[j]
    		s2 += nums[j]
    		for i1 <= j && s1 > goal {
    			s1 -= nums[i1]
    			i1++
    		}
    		for i2 <= j && s2 >= goal {
    			s2 -= nums[i2]
    			i2++
    		}
    		ans += i2 - i1
    		j++
    	}
    	return ans
    }
    
    
  • /**
     * @param {number[]} nums
     * @param {number} goal
     * @return {number}
     */
    var numSubarraysWithSum = function (nums, goal) {
        let i1 = 0,
            i2 = 0,
            s1 = 0,
            s2 = 0,
            j = 0,
            ans = 0;
        const n = nums.length;
        while (j < n) {
            s1 += nums[j];
            s2 += nums[j];
            while (i1 <= j && s1 > goal) s1 -= nums[i1++];
            while (i2 <= j && s2 >= goal) s2 -= nums[i2++];
            ans += i2 - i1;
            ++j;
        }
        return ans;
    };
    
    
    // Solution 2
    /**
     * @param {number[]} nums
     * @param {number} goal
     * @return {number}
     */
    var numSubarraysWithSum = function (nums, goal) {
        let i1 = 0,
            i2 = 0,
            s1 = 0,
            s2 = 0,
            j = 0,
            ans = 0;
        const n = nums.length;
        while (j < n) {
            s1 += nums[j];
            s2 += nums[j];
            while (i1 <= j && s1 > goal) s1 -= nums[i1++];
            while (i2 <= j && s2 >= goal) s2 -= nums[i2++];
            ans += i2 - i1;
            ++j;
        }
        return ans;
    };
    
    

All Problems

All Solutions