前缀和
前缀和就是指前缀的和,例如在数组中,从开始到 i 就是到 i 的前缀和。前缀和一般用来求中间连续某一段的和,例如sum[i] - sum[j - 1]就可以求出j 到 i 这一段的和。
在这一道题目里面,中间某一段连续子数组和为k,意思即为sum[i] - sum[j - 1] = k,也即sum[i] - k = sum[j - 1],所以当我们求每一个的前缀和的时候,只需要统计对应的sum[j - 1]个数即可。sum对应的个数用map存储。注意map[0] = 1,即本身本来有一个。
cpp
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int ans = 0;
unordered_map<int, int> mp;
int pre = 0;
mp[0] = 1;
for (int i : nums) {
pre += i;
ans += mp[pre - k];
++mp[pre];
}
return ans;
}
};
当然还有二维数组的前缀和,不过大致原理就是这样,通过两个前缀和求中间的和。