和相同的二元子数组
题目大意,就是求这个数组中和为k的子数组的个数
解题思路1:哈希map法
class Solution {
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int n=nums.size();
unordered_map<int,int>mp;
int sum=0,ans=0;
for(int i=0;i<n;i++){
mp[sum]++;
sum+=nums[i];
ans+=mp[sum-goal];
}
return ans;
}
};
//假设j~i这段区间的和是要求的k,求前缀和,然后看满足前缀和i-k的点有几个,这个看代码应该可以看懂
解题思路2:三指针(滑动窗口)
class Solution {
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int n=nums.size();
int sum1=0,sum2=0,left1=0,left2=0,right=0,ans=0;
while(right<n){
sum1+=nums[right];
while(left1<=right&&sum1>goal){
sum1-=nums[left1];
left1++;
}
sum2+=nums[right];
while(left2<=right&&sum2>=goal){
sum2-=nums[left2];
left2++;
}
ans+=left2-left1;
right++;
}
return ans;
}
};
//就是,求左边界可以在哪个范围,left1是最小的边界,只有在sum>goal的时候才会前移动
//left2是这个左边界可以的离原点的最远距离
//这两个点之间的距离,就是子数组的个数
//逻辑还是比较好理解的