Leetcode560-Subarray Sum Equals K

题目描述

给定一个整数数组和一个整数 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;	
}

猜你喜欢

转载自blog.csdn.net/weixin_44010678/article/details/88075351
今日推荐