给定一个整数数组和一个整数k,你需要找到连续子数列的和为k的总个数。
样例
样例1
输入: nums = [1,1,1] 和 k = 2
输出: 2
解释:
子数组 [0,1] 和 [1,2]
样例2
输入: nums = [2,1,-1,1,2] 和 k = 3
输出: 4
解释:
子数组 [0,1], [1,4], [0,3] and [3,4]
class Solution {
public:
/**
* @param nums: a list of integer
* @param k: an integer
* @return: return an integer, denote the number of continuous subarrays whose sum equals to k
*/
int subarraySumEqualsK(vector<int> &nums, int k) {
// write your code here
#if 0
//解法一
int size = nums.size();
int sum[size+1];
sum[0] = 0;
for(int i = 1; i <= size; i++)
{
sum[i] = sum[i-1] + nums[i-1];
}
int ans = 0;
for(int i = 1; i <= size; i++)
{
for(int j = 0; j < i; j++)
{
if(sum[i] - sum[j] == k)
ans++;
}
}
return ans;
#endif
//解法二
unordered_map<int, int> mymap;
mymap[0] = 1;
int ans = 0;
int sum = 0;
for(int i = 0; i < nums.size(); i++)
{
sum += nums[i];
int target = sum - k;
if(mymap.count(target) > 0)
{
ans += mymap[target];
}
mymap[sum]++;
}
return ans;
}
};