和为 k 的连续的子数组的个数

思路
暴力破解就不记录了,主要是前缀和加map的思路.
用map记录pre前缀和出现的次数。开始时前缀和为0,出现1次。
所以map[0] = 1;
如果之前已经出现过,那么map[pre] += 1;
遍历时,每次使用pre-k查询map,是否出现,如果出现cout += map[pre - k];否则跳过
int subarraySum(vector<int>& nums, int k) {
std::unordered_map<int, int> map;
int pre = 0;
map[0] = 1;
int sz = nums.size();
int count = 0;
for (int i = 0; i < sz; ++i) {
pre += nums[i];
auto iter = map.find(pre - k);
if (iter != map.end()) {
count += iter->second;
}
iter = map.find(pre);
if(iter != map.end()) {
map[pre] += 1;
}else {
map[pre] = 1;
}
}
return count;
}

浙公网安备 33010602011771号