题解
看到连续子序列和,必然想到前缀和。但是光有前缀和这题还做不了,如何使得和为目标数目呢?
此题和前面做过的一道4SUM有点像,关键还是用map来存储便于查询。
设想 map[ sum ] 表示前缀和为sum的数量,那么当我们累计算得当前位置的和为sum时,
我们考察 map[ sum - k ] 的数量,这就是一份使得 目标数k 成立的答案。
看代码,很巧。
Code
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size();
unordered_map<int,int> m;
int sum=0,ans=0;
m[0]=1;
for(int i=0;i<n;i++){
sum+=nums[i];
if( m.count(sum-k))// sum - (sum-k) = k | 此时的sum-k恰好是在此位之前的 数量
ans+=m[sum-k];
m[sum]++;
}
return ans;
}
};