# 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:

输入:nums = [0,0,0,0,0], goal = 0
输出:15
1
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

解法:滑动窗口

/**
 * @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
Last Updated: 1/11/2022, 10:09:22 PM