看到子数组再看到求和,就应该很清晰的想到前缀和。前缀和是处理该问题的一种非常有效的手段。求解子数组之和等于S[r]-S[l]==k,本质和求两数之和的做法是一样的,用哈希表存储前缀和数组。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size();
vector<int>s(n+1);//前缀和数组
for(int i=0;i<n;i++)
{
s[i+1]=s[i]+nums[i];//这里的数组和yxc讲的不一致s[i]表示前i-1个之和,所以需要开n+1
}
int ans=0;
unordered_map<int,int>cnt;//存储前缀数组
for(int ss:s)
{
if(cnt.count(ss-k)>0)//找到符合条件的前缀数组的个数
{
ans+=cnt[ss-k];//直接加入答案
}
cnt[ss]++;//前缀和是ss的存入哈希表
}
return ans;
}
};