题目
知识点
思路
- 这道题思路非常有意思,由于题目只需要得到和为K的子数组,我们不需要得到中间的过程,因此我们可以利用哈希表优化,记录某个前缀和其对应的子数组数目。
- 例如:
target
= 7,我们的哈希表记录了某一项<7,2>
(前缀和为7
的子数组的结果有2个),那么我们向后计算前缀和得到14时,14-7=7,由于哈希表中记录了<7,2>
,所以结果+2,同时要更新<14,n+2>
(假设原先前缀和14的子数组数量为n) - 可能不好理解为啥有
<7,2>
,(不是要连续的子数组吗),举个例子:
7 -2 3 - 1 7
,其中在计算前缀和时7
和7 -2 3 -1
结果都为7,所以哈希表中有记录了<7,2>
,在计算前缀和最后一个元素得到14,那么14-7=7
,找哈希表7中的那项,得到2,所以结果加2。此时满足的子数组就是7
和-2 3 -1 7
。
代码
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1;
int count = 0, pre = 0;
for (auto& x:nums) {
pre += x;
if (mp.find(pre - k) != mp.end()) {
count += mp[pre - k];
}
mp[pre]++;
}
return count;
}
};