560. 和为 K 的子数组https://leetcode.cn/problems/subarray-sum-equals-k/
给你一个整数数组
nums
和一个整数k
,请你统计并返回 该数组中和为k
的连续子数组的个数 。示例 1:
输入:nums = [1,1,1], k = 2 输出:2
官方答案
算法思路:pre[i]=pre[i-1]+nums[i]; 将以i为结尾的nums[i]的前i项的和添加入map,map键为pre,值为该pre出现的次数;若map中存在pre-k,则pre[j]+nums[i]=k存在;此时将该pre出现的次数累加到ans即可得到;
class Solution {
public int subarraySum(int[] nums, int k) {
int ans=0;//答案
int pre=0;//记录前i项的和
HashMap<Integer,Integer> map=new HashMap<>();
map.put(0,1);//key表示以i结尾的nums元素之和,value表示该数字出现的次数
//循环遍历求出前i项的和
for(int i=0;i<nums.length;i++){
pre+=nums[i];
//前i项的和pre[i]=pre[i-1]+nums[i]
if(map.containsKey(pre-k)){
ans+=map.get(pre-k);
}
//将前i项的和添加入map
map.put(pre,map.getOrDefault(pre,0)+1);
}
return ans;
}
}