汇芳书院

专注计算机视觉、机器学习、分布式计算等领域, 兼聊投资、写作、生活

0%

560. 和为K的连续子数组

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

 

示例 1:

输入:nums = [1,1,1], k = 2
输出:2
示例 2:

输入:nums = [1,2,3], k = 3
输出:2  

提示:

1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107


暴力枚举, 无法通过OJ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size(), ans = 0;
for (int start = 0; start < n; start++) {
int tmp = 0;
for (int end = start; end < n; end++) {
tmp += nums[end];
if (tmp == k) ans++;
}
}
return ans;

}
};

前缀和+哈希表

记录pre[i]为序号为0-i的数组中所有数的和。
对于序号为[i, j]的子树组来说,如果pre[j]-pre[i-1] == k, 则其为一个目标答案。

可以考虑用一个哈希表记录所有前缀和出现的次数,遍历一次即可求得答案。

时间复杂度和空间复杂度均为O(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size(), ans = 0, pre = 0;
unordered_map<int, int> mp;
mp[0] = 1;
for (int start = 0; start < n; start++) {
pre += nums[start];
if (mp.find(pre-k) != mp.end()) {
ans += mp[pre-k];
}
mp[pre]++;
}
return ans;

}
};

坚持原创分享,您的支持将鼓励我继续创作

欢迎关注我的其它发布渠道

------------- 本文结束,感谢阅读 如有问题可留言交流 -------------