问题描述 链接到标题
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 <= nums.length <= 2 * 10⁴
-1000 <= nums[i] <= 1000
-10⁷ <= k <= 10⁷
解题思路 链接到标题
一次遍历,记录数组的前缀和prefix[i]
,然后在ump
中查找key
为prefix[i] - target
的元素是否存在,如果存在res += ump[prefix[i] - k]
,++ump[prefix[i]]
。
代码 链接到标题
class Solution {
public:
int subarraySum(vector<int> &nums, int k) {
vector<int> prefix(nums.size() + 1);
std::unordered_map<int, int> ump;
ump[0] = 1;
int res = 0;
for (int i = 1; i <= nums.size(); ++i) {
prefix[i] = prefix[i - 1] + nums[i - 1];
if (ump.find(prefix[i] - k) != ump.end()) {
res += ump[prefix[i] - k];
}
++ump[prefix[i]];
}
return res;
}
};