题目地址:
https://leetcode.com/problems/subarray-sum-equals-k/
给定一个数组,再给定一个数 k k k,问这个数组中有多少个子数组其和为 k k k。
容易想到用前缀和。遍历前缀和的同时可以用一个哈希表记录每个前缀和出现了多少次,同时做计数即可。代码如下:
class Solution {
public:
int subarraySum(vector<int>& a, int k) {
unordered_map<int, int> mp;
// 空前缀的和是0,有1个
mp[0] = 1;
int res = 0;
for (int i = 0, s = 0; i < a.size(); i++) {
s += a[i];
res += mp[s - k];
mp[s]++;
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。