930. 和相同的二元子数组-前准和+滑动窗口
给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。
子数组 是数组的一段连续部分。
示例 1:
输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
有 4 个满足题目要求的子数组:[1,0,1]、[1,0,1,0]、[0,1,0,1]、[1,0,1]
示例 2:
输入:nums = [0,0,0,0,0], goal = 0
输出:15
这题其实并不简单哈,这个是滑动窗口的一种变形,也可以说是双滑动窗口,解题代码如下:
int numSubarraysWithSum(int* nums, int numsSize, int goal){
int count =0;
for(int i=1;i<numsSize;i++){
nums[i]=nums[i]+nums[i-1];
// printf("%d ",nums[i]);
}
int low=1,high1=1,high2=1;
low=0,high1=0,high2=0;
while(high2<numsSize&&nums[high2]<=goal){
high2++;
}
while(high1<numsSize&&nums[high1]<goal){
high1++;
}
count=count+high2-high1;
low=1,high1=1,high2=1;
while(low<numsSize){
while(high2<numsSize&&nums[high2]-nums[low-1]<=goal){
high2++;
}
while(high1<numsSize&&nums[high1]-nums[low-1]<goal){
high1++;
}
while(high1<low){
high1++;
}
count=count+high2-high1;
low++;
}
return count;
}