leetcode0560. 和为 K 的子数组-medium
1 题目:和为 K 的子数组
官方标定难度:中
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1
<
=
n
u
m
s
.
l
e
n
g
t
h
<
=
2
∗
1
0
4
1 <= nums.length <= 2 * 10^4
1<=nums.length<=2∗104
−
1000
<
=
n
u
m
s
[
i
]
<
=
1000
-1000 <= nums[i] <= 1000
−1000<=nums[i]<=1000
−
1
0
7
<
=
k
<
=
1
0
7
-10^7 <= k <= 10^7
−107<=k<=107
2 solution
本题需要反复计算区间和,所以用前缀和——减法代替区间求和。还需要反复验证有没有连个数的差是否是目标数,所以可以用 hashmap 。
代码
class Solution {
public:
int subarraySum(vector<int> &nums, int k) {
/*
* 计算前缀和,用 hashmap 存储, 动态查看有之前有几个值满足 pre_sum[i] - k,记录下来
*/
unordered_map<int, int> pre;
int sum = 0;
int pre_sum = 0;
for(int i = 0; i < nums.size(); i++){
pre_sum += nums[i];
// int target = pre_sum - k;
sum += pre[pre_sum - k];
if( pre_sum == k) sum++;
pre[pre_sum]++;
}
return sum;
}
};