Problem
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 * 10^4
nums[i]
is either0
or1
.0 <= goal <= nums.length
Solution (Java)
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;
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).