930 和相同的二元子数组

本文最后更新于:2021年7月9日 晚上

给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal非空 子数组。

子数组 是数组的一段连续部分。

示例 1:

1
2
3
4
输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
有 4 个满足题目要求的子数组:[1,0,1][1,0,1,0][0,1,0,1][1,0,1]

示例 2:

1
2
输入:nums = [0,0,0,0,0], goal = 0
输出:15

提示:

  • 1 <= nums.length <= 3 * 104
  • nums[i] 不是 0 就是 1
  • 0 <= goal <= nums.length

Solution

参考:@LeetCode官方

  • 前缀和 + 哈希表
  • 用哈希表记录每一种前缀和出现的次数,假设我们当前枚举到元素 nums[j],我们只需要查询哈希表中元素 sum[j]−goal 的数量即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int res = 0;
unordered_map<int, int> umap;
int sum = 0;
for (int num : nums) {
umap[sum]++;
sum += num;
res += umap[sum - goal];
}
return res;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!