一、题目
给你一个二元数组 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)
