1 题目
2 分析
通过一次for循环,我们可以获得数组的前缀和,
前缀和之差 就是各种 连续数字串的和。
因此当我们求出一个前缀和sum
后,我们就去我们之前已经求出的前缀和里找有没有等于sum-k
的,如果有, 那说明就找到一个解了。
注意:这里一定是去已经求出的前缀和里找,也就是说,mp[sum]++
应该在for
循环最后实现,否则当k=0
的时候,mp[sum-k]!=0
永远成立。
3 实现
sum
:记录当前i
的前缀和map<int,int> mp
:记录当前i
之前的所有前缀和+等于该前缀和值的个数res
:答案
4 代码
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int res=0;
map<int,int> mp;//记录所有的前缀和
mp[0]=1;//前缀和为0
int sum=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];//记录当前前缀和
if(mp.count(sum-k)!=0)//如果当前前缀和sum-以前的某个前缀和=k 就说明找到解
res+=mp[sum-k];
mp[sum]++;//记录当前以前的所有前缀和
}
return res;
}
};