一、题目描述
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
注意:nums中的元素可为负数
输入:nums = [1,1,1], k = 2
输出:2
输入:nums = [1,2,3], k = 3
输出:2
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
二、题目解答
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
//假设数组的前缀和为presum[i],那么对于任意两个下标i,j
//如果presum[j]-presum[i] = k
//那么从i+1到j的连续子数组合为 k
//在遍历过程中,用哈希表存储前缀和出现的次数
//如果存在哈希表中,那么就count+出现次数
int sum = 0;
int count = 0;
map <int, int> map_tmp;
map_tmp [0] = 1;
for (int i = 0; i < nums.size(); i++){
sum = sum + nums[i];
//有当前前缀和-k的前缀和
if (map_tmp.find(sum - k) != map_tmp.end())
count += map_tmp[sum - k];
//判断完毕后再加入map
map_tmp[sum]++;
}
return count;
}
}