前缀和+哈希表
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {//前缀和+双指针
vector<int> sum(nums.size());
unordered_map<int,int> hmap;
hmap[0]=1;//总和为0的情况 不加入元素时就有一种情况。
long long ans=0;
for(int i=0;i<nums.size();++i){
if(i==0) sum[i]=nums[i];
else sum[i]=sum[i-1]+nums[i];
if(hmap.find(sum[i]-k)!=hmap.end()){//查看sum[i]-k在之前出现过没,如果出现过,则答案包含这个
ans+=hmap[sum[i]-k];//sum[i]-sum[j]=k;
}
hmap[sum[i]]+=1;
}
return ans;
}
};
空间优化:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {//前缀和+双指针
int sum=0;
unordered_map<int,int> hmap;
hmap[0]=1;//总和为0的情况 一开始就有
long long ans=0;
for(int i=0;i<nums.size();++i){
sum+=nums[i];
if(hmap.find(sum-k)!=hmap.end()){//查看k-sum[i]在之前出现过没,如果出现过,则答案包含这个
ans+=hmap[sum-k];//sum[i]-sum[j]=k;
}
hmap[sum]+=1;
}
return ans;
}
};