题目描述
给你一个二元数组 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 * 104
nums[i] 不是 0 就是 1
0 <= goal <= nums.length
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-subarrays-with-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
思路一:哈希表+前缀和
利用哈希表存储<数组前缀和, 出现的频次>,如此一来当前缀和preSum已经大于等于goal的时候,计数需要加上hashmap.getOrDefault(preSum-goal, 0)
,(preSum-goal
代表子数组的和)且如果preSum刚好等于goal,计数额外+1
思路二:滑窗
需要用到两个左指针left1和left2,一个右指针right,以及两个求和变量sum1和sum2。 l e f t 1 ≤ l e f t 2 ≤ r i g h t left1 \leq left2 \leq right left1≤le