题目描述
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例
输入: nums = [1,1,1], k = 2
输出: 2
思路
1、对原数组求前缀和后,一个和为 k 的子数组即为一对前缀和的差值为 k 的位置。
2、遍历前缀和数组,map 哈希表记录每个前缀和出现的次数。特别地,初始时前缀和为 0 需要被额外记录一次。
3、遍历过程中,对于当前前缀和sunm,累计之前 sum - k 前缀和出现的次数累积到答案即可。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,k,sum=0,s=0;
char c;
vector<int>nums;
map<int,int>hash;
hash[0]=1;
while(scanf("%d%c",&a,&c))
{
nums.push_back(a);
if(c=='\n')
break;
}
scanf("%d",&k);
for(int i=0;i<nums.size();i++)
{
s+=nums[i];
sum+=hash[s-k];
hash[s]++;
}
cout<<sum<<endl;
}