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

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2

输出:2

示例 2:

输入:nums = [1,2,3], k = 3

输出:2


这是很经典、很重要的一道题,也是前缀和的经典题。

思路:用一个哈希表 mp 统计前缀和出现的次数。mp[sum] 代表前缀和为 sum 出现的次数。mp[sum - k] 代表和为 k 的子数组出现的次数。

比如假设当前前缀和 sum = 10,目标找到和为 4 (k = 4) 的子数组,只需要看前缀和 6 出现的次数。

C++14 linesExpandCollapse
int subarraySum(vector<int>& nums, int k) {
    int ans = 0;
    int sum = 0;
    
    unordered_map<int, int> mp;
    mp[0] = 1;
    
    for (int num : nums) {
        sum += num; // 前缀和
        if (mp.count(sum - k)) ans += mp[sum - k];
        mp[sum]++;
    }
    return ans;
}