给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
思路就是前缀和,只不过这里用HashMap存储了,因为这里前缀和有可能是负数,不能用数组。
考虑遍历到第i位,当前到第i位的前缀和为m,要达到的整数和为k,那么令gap = m-k,只要看第i位前存在多少个前缀和等于gap,那么答案里就多了多少个符合题意的子数组。
遍历完每一位再把当前前缀和值的个数加一即可。
class Solution {
public int subarraySum(int[] nums, int k) {
HashMap<Integer,Integer>map = new HashMap<Integer,Integer>();
map.put(0,1);
int sum = 0;
int ans = 0;
int len = nums.length;
for(int i=0;i<len;i++)
{
sum+=nums[i];
int gap = sum - k;
int value = 0;
if(map.containsKey(gap))
value = map.get(gap);
ans+=value;
int v = 0;
if(map.containsKey(sum))
v = map.get(sum);
v++;
map.put(sum,v);
}
return ans;
}
}