class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
if(nums.size()<=0) return 0;
int res=0;
unordered_map<int,int> map;
map[0]=1;
int sum=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
if(map.count(sum-k)){
res+=map[sum-k];
}
map[sum]++;
}
return res;
}
};
从j到i求和等于k,不断累积从0开始到i的和,当前pre-i减去pre-j-1等于k,找到所有这样的可能,也就是pre-j-1 等于sum-k,使用一个map对sum进行计数,然后遍历到i的时候,sum-k,是不是某个0-j-1的前缀和呢?如果是,把计数取出来,就是个数了,同时不要忘记给当前sum计数加一。