题目描述:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。

方法1:前缀和+哈希表,i次循环处理每一个数,用一个数记录第i个数的前缀和,用一个哈希表存储第i个数之前所有数的不同前缀和以及其出现的次数,只要(第i个数的前缀和-k)在哈希表中找到,就证明这几段子数组的和为k,记得map[0] = 1

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
         int count = 0;//和为k的子数组个数
         int pre_sum = 0;//循环记录到当前数的前缀和
         unordered_map<int,int>map;//记录到当前数之前所有前缀和以及其出现的次数
         map[0] = 1;
         for(int i=0;i<nums.size();i++){
            pre_sum += nums[i];
            if(map.find(pre_sum-k) != map.end()) count += map[pre_sum-k]; 
            map[pre_sum]++;
         }
         return count;
    }
};