巧用哈希表与前缀和,前缀和差为k的两个序号之间的数组就是满足条件的子数组,用哈希表来存放每个序号的前缀和。
前缀和就是头元素到当前序号子数组元素的和
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1;
int count = 0, pre = 0;
for (auto& x:nums) {
pre += x;
if (mp.count(pre - k)) {//看有没有前缀和差为目标k的两个序号
count += mp[pre - k];//有的话答案加上满足的前序数量
}
mp[pre]++;//记录每一个序号的前缀和,前缀和相等的话,map->second计数会加一
}
return count;
}
};