All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0901_1000.s0930_binary_subarrays_with_sum.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0901_1000.s0930_binary_subarrays_with_sum;

// #Medium #Array #Hash_Table #Prefix_Sum #Sliding_Window
// #2022_03_29_Time_3_ms_(84.84%)_Space_56.9_MB_(44.53%)

/**
 * 930 - Binary Subarrays With Sum\.
 *
 * Medium
 *
 * 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`
**/
public class Solution {
    public int numSubarraysWithSum(int[] nums, int goal) {
        return goal == 0
                ? numSubarraysWithAtMostGoal(nums, 0)
                : numSubarraysWithAtMostGoal(nums, goal)
                        - numSubarraysWithAtMostGoal(nums, goal - 1);
    }

    private int numSubarraysWithAtMostGoal(int[] nums, int goal) {
        int windowSum = 0;
        int left = 0;
        int right = 0;
        int res = 0;
        while (right < nums.length) {
            windowSum += nums[right++];
            while (left < right && windowSum > goal) {
                windowSum -= nums[left++];
            }
            res += (right - left);
        }
        return res;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy