# 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]
1
2
3
4
2
3
4
示例 2:
输入:nums = [0,0,0,0,0], goal = 0
输出:15
1
2
2
解法:哈希表
/**
* @param {number[]} nums
* @param {number} goal
* @return {number}
*/
var numSubarraysWithSum = function(nums, goal) {
let sum = 0;
let map = new Map();
let res = 0;
for(let item of nums){
map.set(sum,(map.get(sum)||0)+1);
sum += item;
res += map.get(sum-goal) || 0;
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
解法:滑动窗口
/**
* @param {number[]} nums
* @param {number} goal
* @return {number}
*/
var numSubarraysWithSum = function(nums, goal) {
let res = 0;
for(let i=0,l1=0,l2=0,s1=0,s2=0;i<nums.length;i++){
s1 += nums[i];
s2 += nums[i];
while(l1 <= i && s1 > goal) s1 -= nums[l1++];
while(l2 <= i && s2 >= goal) s2 -= nums[l2++];
res += l2 - l1;
}
return res;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16