
class Solution {
public:
int subarraySum0(vector<int>& nums, int k) {
int res = 0;
int len = nums.size();
for (int i = 0; i<len; i++) {
int sum = 0;
for (int j = i; j<len; j++) {
sum += nums[j];
if (sum == k) {
res++;
}
}
}
return res;
}
int subarraySum1(vector<int>& nums, int k) {
int res = 0;
int len = nums.size();
std::vector<int> pre_sum(len+1, 0);
for (int i = 0; i<len; i++) {
pre_sum[i+1]=pre_sum[i]+nums[i];
}
for (int i = 0; i<pre_sum.size(); i++) {
for (int j = i; j<len; j++){
if (pre_sum[j+1] - pre_sum[i] == k) res++;
}
}
return res;
}
int subarraySum(vector<int>& nums, int k) {
std::unordered_map<int, int> mp{{0,1}};
int sum = 0;
int res = 0;
for (auto n: nums) {
sum += n;
if (auto it=mp.find(sum-k); it!=mp.end()){
res += it->second;
}
mp[sum]++;
}
return res;
}
};