项目场景:
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例:
- 输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
解法:
1.前缀和
用pre记录当前的数字和,用哈希表记录前i项的和,键是数字和,值是出现的次数,每当在记录的时候,判断 pre - k 的值是否出现在哈希表中,如果出现,则将出现的次数进行累加。
时间复杂度O(N)
空间复杂度O(N)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int cnt = 0;
unordered_map<int, int> tmp;
int pre = 0;
tmp[0]++;
for (auto num : nums)
{
pre += num;
if (tmp.count(pre - k))
{
cnt += tmp[pre - k];
}
tmp[pre]++;
}
return cnt;
}
};