class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size();
int presum[20010]={0};
unordered_map<int,int> mp;
mp[0]=1; //前n项和0,出现次数为1次
int ans = 0;
for(int i=1;i<=n;++i)
{
presum[i]=presum[i-1]+nums[i-1]; //计算前缀和
ans+=mp[presum[i]-k]; //去已经存入哈希表的前面的元素中寻找子连续数组
++mp[presum[i]]; //哈希表里面存储的是前n项和出现的次数
}
return ans;
}
};
O(n)做法:记录前缀和,0项指全部为空,只有一种取法。其他细节见代码和注释。