思路:假如存在区间[left,right],使得[left,right]这个区间的子数组的和为k。换句话说,就是[0,right]这个区间的和减去[0,left]这个区间的和等于k。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int sum = 0, res = 0;
unordered_map<int, int>mp;//key-value表示共有value个连续子数组(均从数组第一个元素开始),使得和为key
mp[0] = 1;//初始化,sum等于k时会用到
for (int i : nums)
{
sum += i;
if (mp.find(sum - k) != mp.end()) res += mp[sum - k];
mp[sum]++;//mp[sum]先自动创建并初始化value为0,然后再+1
}
return res;
}
};