给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
思路::假设sum[i]
为前i
个数累计和,i
之前存在一个j
,使得sum[i]-sum[j]==k
,因此nums[i:j]
为一个连续的并且和为K
的子数组。可以用sum代替sum数组,用哈希表来储存当前索引累计和。
算法流程:
1.遍历数组,每遍历一个数sum+=nums[i]
2.从map中找是否存在一个累计和为sum-k,若存在,count+map.get(sum-k)
,用count表示满足条件子数组的个数。
3.将sum存入哈希表中,以累计和为键,次数为值,若sum第一次出现,则次数置为1,若表中存在,则表中的值+1
public int subarraySum(int[] nums, int k) {
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
int sum=0;
int count=0;
map.put(0,1);
for(int i=0;i<nums.length;i++){
sum+=nums[i];
if(map.containsKey(sum-k))
count =count+map.get(sum-k);
if(map.containsKey(sum))
map.put(sum,map.get(sum)+1);
else
map.put(sum,1);
}
return count;
}