力扣930.和相同的二元子数组
哈希表法
-
最终[l,r]区间和为goal
-
sum为记录的非递减前缀和
- sum[r] - sum[l] = goal
- 因此遍历右端点时 找到左端点为sum[l]的出现次数即可
-
class Solution { public: int numSubarraysWithSum(vector<int>& nums, int goal) { int n = nums.size(); unordered_map<int,int> cnt; int res=0,sum=0; for(auto num:nums) { cnt[sum] ++; sum += num; res += cnt[sum - goal]; } return res; } };
多指针法
-
用l1,l2存符合要求的l的区间
-
class Solution { public: int numSubarraysWithSum(vector<int>& nums, int goal) { int n = nums.size(); int res=0,s1=0,s2=0; for(int l1=0,l2=0,r=0;r<n;r++) { s1 += nums[r]; s2 += nums[r]; //s1 --> goal while(l1 <= r && s1 > goal) s1 -= nums[l1++]; //s2 --> <goal while(l2 <= r && s2 >= goal) s2 -= nums[l2++]; res += l2 - l1; } return res; } };