给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
这道题不难,主要是前缀和+HashMap的做法,在后面许多二维的矩阵问题中都很有用.
- 使用前缀和+HashMap
- 用map存放前缀和以及出现的次数
- 然后每次查找prSum-k是否在map中出现过即可
注意:map.put(0, 1);//这一步至关重要,千万别忘了,因为第一个满足prSum-k的前缀和肯定会是(0,1),所以需要使用到这一项,这个必须要写上
public class leetcode560 {
public static void main(String[] args) {
int[] nums = new int[]{1, 1, 1};
System.out.println(subarraySum(nums, 2));
}
//使用前缀和+HashMap
//用map存放前缀和以及出现的次数
//然后每次查找prSum-k是否在map中出现过即可
public static int subarraySum(int[] nums, int k) {
int preSum = 0;
Map<Integer, Integer> map = new HashMap<>();//key表示前缀和,value表示次数
map.put(0, 1);//这一步至关重要,千万别忘了,因为第一个满足prSum-k的前缀和肯定会是(0,1),所以需要使用到这一项
int ans = 0;
for (int i = 0; i < nums.length; i++) {
preSum += nums[i];
if (map.containsKey(preSum - k)) {
ans += map.get(preSum - k);
}
map.put(preSum, map.getOrDefault(preSum, 0) + 1);
}
return ans;
}
}