题目描述:
给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。
子数组 是数组的一段连续部分。
示例 1:
输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
如下面黑体所示,有 4 个满足题目要求的子数组:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
示例 2:
输入:nums = [0,0,0,0,0], goal = 0
输出:15
提示:
1 <= nums.length <= 3 * 10^4
nums[i] 不是 0 就是 1
0 <= goal <= nums.length
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
if(nums==null||nums.length==0||goal<0)
return 0;
int sum=0;
int dp=0;
Map<Integer,Integer> hashMap=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++)
{
dp+=nums[i];
if(dp==goal)
sum++;
sum+=hashMap.getOrDefault(dp-goal,0);
hashMap.put(dp,hashMap.getOrDefault(dp,0)+1);
}
return sum;
}
}