要求:个数
思路:前缀和,我们考虑以 i 结尾的和为 k 的连续子数组个数时只要统计有多少个前缀和为 pre[i]−k 的 pre[j] 即可
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int s=0, cnt=0;
unordered_map<int, int> mp; // 记录前缀和出现次数
mp[0] = 1; // 初始化前缀和为0出现1次
for(auto& x: nums){
s += x; // 前缀和累加
if(mp.count(s-k)) // 加上(当前前缀和-k)出现次数
cnt += mp[s-k];
mp[s]++; // 当前前缀和记录次数+1
}
return cnt;
}
};