题目描述:
给你一个二元数组 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]
题源:https://leetcode-cn.com/problems/binary-subarrays-with-sum/
代码:
class Solution { public: int numSubarraysWithSum(vector<int>& nums, int goal) { int l=nums.size(); int res=0; int pos[30005]; if (goal==0) { int i=0; int k; while(i<l) { if (nums[i]==1) {i++; continue;} k=0; while(i<l && nums[i]==0) {k++; i++;} res+=(1+k)*k/2; } } else { int k=0; for(int i=0;i<l;i++) if(nums[i]==1) pos[++k]=i; for(int i=1;i+goal-1<=k;i++) { int s=pos[i]; int t=pos[i+goal-1]; int num1=1; int num2=1; while(s-1>=0 && nums[s-1]==0) {num1++; s--;} while(t+1<l && nums[t+1]==0) {num2++; t++;} res+=num1*num2; } } return res; } };
class Solution { public: int numSubarraysWithSum(vector<int>& nums, int goal) { int sum = 0; unordered_map<int, int> cnt; int ret = 0; for (auto& num : nums) { cnt[sum]++; sum += num; ret += cnt[sum - goal]; } return ret; } };