题目描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入: nums = [1,1,1], k = 2
输出: 2
示例 2:
输入: nums = [1,2,3], k = 3
输出: 2
提示:
1<=nums.length<=2∗1041 <= nums.length <= 2 * 10^41<=nums.length<=2∗104
-1000 <= nums[i] <= 1000
−107<=k<=107-10^7 <= k <= 10^7−107<=k<=107
思路
1 求出前缀和。
2 一段和为k的子数组,将首部标记为i,尾部标记为j,那么pre[j] = pre[i-1] + k。
3 因此每次利用哈希表记录pre[i]的个数,答案加上 pre[j] - k 的个数即可。
代码
cpp
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size();
vector<int>pre(n + 1, 0);
/*
pre[j] = pre[i] + k
pre[i] = pre[j] - k
*/
unordered_map<int, int> ump;
int ans = 0;
ump[0] = 1;
for(int j = 1; j <= n; ++j)
{
pre[j] = pre[j - 1] + nums[j - 1];
ans += ump[pre[j] - k];
++ump[pre[j]];
}
return ans;
}
};