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;
}
}