和为K的子数组(leetcode.560)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int count = 0;
int sum = 0;
// 假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位置到第i个位置的元素之和。那么对于任意的两个下标i和j(i < j),如果prefixSum[j] - prefixSum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。
// 前缀和集合,key为
unordered_map<int,int> map;
// nums[0]的前缀和必定为0,一开始就可以初始化前缀和为0的次数为1
map[0] = 1;
for(int i = 0;i < nums.size();i++){
// sum用于记录每个元素的前缀和,每次循环多加一个元素
sum+=nums[i];
if(map.find(sum - k) != map.end()){
// count记录符合题目条件的数组个数
count += map[sum-k];
}
map[sum] = map[sum] + 1;
}
return count;
}
};