和为K的子数组(前缀和+mp)
给你一个整数数组\(nums\)和一个整数\(k\),请你统计并返回 该数组中和为\(k\)的子数组的个数。子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
\(1 <= nums.length <= 2 * 10^4\)
-1000 <= nums[i] <= 1000
\(-10^7 <= k <= 10^7\)
这个题是前缀和+mp的题,
我们用前缀和看就是sun[j]-sum[i]=k,我们从0开始用map将前缀和mp[sum[i]]++,我们对于一个j,我们只需要看看前面有几个sum[i],然后就是ans+=mp[sum[j]-k]就行
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int ans=0;
int n=nums.size(),sum=0;
map<int,int>mp;
mp[0]=1;
for(int i=0;i<n;i++){
sum+=nums[i];
if(mp[sum-k]){
ans+=mp[sum-k];
}
mp[sum]++;
}
return ans;
}
};