version 1
哈希表
一对前缀和差值为k的不同位置
前缀和为sum[i] - sum[j-1] 所以从下标0开始的前缀和需要包含sum[-1]=0这个情况,放入哈希表中mp[0]++
也就是代码中的mp[0] = 1
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp; //这是类,不是数组,所以不会越界
int sum = 0, res = 0;
mp[0] = 1; //sum自身等于k
//表示从a[0]一直加到a[i]等于k
//前缀和为0的情况,是针对放第一个元素的情况,因为每次是先判断
for(auto x : nums){
sum += x;
res += mp[sum - k];
mp[sum]++;
}
return res;
}
};
version 2
暴力枚举
把前缀和存在sum数组中sum[0] = 0, sum[1] = nums[1]
class Solution {
public:
int sum[20007];
int subarraySum(vector<int>& nums, int k) {
for(int i = 0; i < nums.size(); i++){
sum[i+1] = sum[i] + nums[i];
}
int ans = 0;
for(int i = 0 ;i < nums.size(); i++){
for(int j = 0; j <= i; j++){
if(sum[i+1] - sum[j] == k) ans++; //计算j到i的和是否满足等于k
}
}
return ans;
}
};
version 3
暴力枚举
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size();
int res = 0;
unordered_map<int, int> sum;
for(int i = 0; i < n; i++){
sum[i] = sum[i-1] + nums[i]; //sum[-1]在数组中会报错,但是在哈希表中没关系
}
for(int i = 0; i < n; i++){
for(int j = 0; j <= i; j++){ //j和i相差1
int t = sum[i] - sum[j-1];
if( t == k)
res++;
}
}
return res;
}
};