一、题目

给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 非空 子数组。
子数组 是数组的一段连续部分。

点击查看原题
难度级别: 中等

二、思路

1)前缀和+哈希表

根据前缀和的思想,连续数组[i, j]之和等于两个前缀和之差
使用哈希表找到我们需要的前缀和就可以知道:以位置j结尾,有多少个连续数组满足和为goal

三、代码

1)前缀和+哈希表

  1. class Solution {
  2. public int numSubarraysWithSum(int[] nums, int goal) {
  3. int sum = 0;
  4. int ans = 0;
  5. Map<Integer, Integer> map = new HashMap();
  6. for (int i = 0; i < nums.length; i++) {
  7. map.put(sum, map.getOrDefault(sum, 0) + 1);
  8. sum += nums[i];
  9. ans += map.getOrDefault(sum - goal, 0);
  10. }
  11. return ans;
  12. }
  13. }

时间复杂度为O(n),空间复杂度为O(n)