560. 和为 K 的子数组

> //20220404
> 题目描述:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
> 题目链接:[点我](https://leetcode-cn.com/problems/subarray-sum-equals-k/)

### 解题思路:
- 我们设p(i)表示从数组开始到i位置的前缀和,则有j-i区间元素的和为p(i)- p(j-1),而我们需要找到的是数组中和为k的子数组的个数,所以,判断条件为p(i)- p(j-1) == k,通过移项,可得p(j-1)== p(i)- k,而p(i)在我们遍历数组的时候动态可得,所以我们只需要存储p(j-1)就行了,但是p(j-1)有可能不止一种排列方式,所以,需要设置map来存储其出现的次数
- 代码如下

```java
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();//保存对应前缀和的次数
map.put(0,1);
int count = 0;
int sum = 0;
for(int i = 0;i<nums.length;++i){
sum += nums[i];//计算前缀和
if(map.containsKey(sum-k)){//说明存在符合条钱的前缀和
count += map.get(sum-k);
}

map.put(sum,map.getOrDefault(sum,0)+1);
}
return count;
}
}
```

---
希望对大家有所帮助
以上

posted @ 2022-04-04 11:57  醉生梦死_0423  阅读(18)  评论(0编辑  收藏  举报