# 560. 和为 K 的子数组 (Medium)

## 问题描述
[560. 和为 K 的子数组 (Medium)](https://leetcode.cn/problems/subarray-sum-equals-k/)

给你一个整数数组 `nums` 和一个整数 `k` ，请你统计并返回 该数组中和为 `k` 的连续子数组的个数 。

**示例 1：**

```
输入：nums = [1,1,1], k = 2
输出：2

```

**示例 2：**

```
输入：nums = [1,2,3], k = 3
输出：2

```

**提示：**

- `1 <= nums.length <= 2 * 10⁴`
- `-1000 <= nums[i] <= 1000`
- `-10⁷ <= k <= 10⁷`

## 解题思路
一次遍历，记录数组的前缀和`prefix[i]`，然后在`ump`中查找`key`为`prefix[i] - target`的元素是否存在，如果存在`res += ump[prefix[i] - k]`，`++ump[prefix[i]]`。

## 代码
```cpp
class Solution {
  public:
    int subarraySum(vector<int> &nums, int k) {
        vector<int> prefix(nums.size() + 1);
        std::unordered_map<int, int> ump;
        ump[0] = 1;
        int res = 0;
        for (int i = 1; i <= nums.size(); ++i) {
            prefix[i] = prefix[i - 1] + nums[i - 1];
            if (ump.find(prefix[i] - k) != ump.end()) {
                res += ump[prefix[i] - k];
            }
            ++ump[prefix[i]];
        }
        return res;
    }
};
```

