一、介绍
1.题目描述
题目链接:
https://leetcode-cn.com/problems/subarray-sum-equals-k/
给你一个整数数组 nums
和一个整数 k
,请你统计并返回该数组中和为 k
的连续子数组的个数。
2.测试样例
[1,1,1]
2
# 2
[1,2,3]
3
# 2
[0,0,0,0,0]
0
# 15
二、题解
1、map+前缀和🔴
我们定义pre[i]
代表num[0]+num[1]+...+num[i]
的和【即前n项的和】。
当某个连续序列num[j]+...num[i]=k
,可以写为等式 pre[i]-pre[j-1]=k
,移项得到pre[j-1]=pre[i]-k
。
即问题转换为:当遍历到i
时,只要找到前面有几个j
,pre[j-1]
的值满足pre[i]-k
,总个数加该j
的个数。
利用map
记录pre[j]
的值以及其对应的个数。
- 当遍历到
i
,当前前缀和为pre[i]=x
,要满足从j
到i
的子序列和为k
,则j
之前的序列和【即[0,j-1]
的序列和】需要=x-k
参考链接:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// count记录答案,pre记录前面所有元素的和
int count = 0,n=nums.size(),pre=0;
unordered_map<int,int> mp; // mp记录前缀和及个数
mp[0]=1; // 初始化前缀和为0的个数是1
for(int i=0;i<n;i++){
pre+=nums[i];
if(mp.count(pre-k)) count+=mp[pre-k]; // 总个数更新
mp[pre]++; // mp 记录
}
return count;
}
};