思路:哈希表+前缀和
哈希表记录前缀和为k的索引有几个,遍历一次就可以得到子数组为k的元素一共有多少个。
核心是:count+=memo[pre[i]-k];
要注意的是:如果pre[]-k等于0的话,也是有一个子数组的。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int> memo;
vector<int> pre(nums.size()+1,0);
memo[0]=1;//保证索引之前的子数组计算在结果之内
int res=0;
for(int i=0;i<nums.size();i++){//能进来就是可以保证元素数目大于0
pre[i+1]=nums[i]+pre[i];//先得到前缀和
res+=memo[pre[i+1]-k];//如果pre[i+1]-k==0,memo[0]=1可以保证从0到当前索引是一个结果
memo[pre[i+1]]++;//如果k是0的话,放在这里可以保证memo[pre[i+1]]不被计算进去
}
return res;
}
};