思路:前缀和+hash
[i,j]的区间和为sums[j]-sums[i-1] ==k,转化为:sums[i-1] = sums[j] - k。
因此:遍历到j时,看一下前面有多少下标的sums[]值为 sums[j] - k,就是以j结尾和为k有多少个。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int ans = 0, n = nums.size(), sum = 0;
unordered_map<int, int> ump;
ump[0]++;
for (int i = 0; i < n; ++i) {
sum = sum + nums[i];
ans += (ump.count(sum - k)) ? ump[sum - k] : 0;
ump[sum]++;
}
return ans;
}
};