一、题目
给你一个二元数组 nums
,和一个整数 goal
,请你统计并返回有多少个和为 goal
的** 非空** 子数组。
子数组 是数组的一段连续部分。
点击查看原题
难度级别: 中等
二、思路
1)前缀和+哈希表
根据前缀和的思想,连续数组[i, j]
之和等于两个前缀和之差
使用哈希表找到我们需要的前缀和就可以知道:以位置j
结尾,有多少个连续数组满足和为goal
三、代码
1)前缀和+哈希表
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
int sum = 0;
int ans = 0;
Map<Integer, Integer> map = new HashMap();
for (int i = 0; i < nums.length; i++) {
map.put(sum, map.getOrDefault(sum, 0) + 1);
sum += nums[i];
ans += map.getOrDefault(sum - goal, 0);
}
return ans;
}
}
时间复杂度为O(n)
,空间复杂度为O(n)