leetcode——和为K的子数组(java)
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
解题方法:(哈希表+前缀和)
1.经过分析此题可以用哈希表与前缀和的方法进行解题,首先其涉及到与k
的差值的问题,可以用哈希表来记录。
2.其次由于其是子数组的和,所以我们可以使用前缀和来进行记录。
3.创建哈希表之后,我们需要提前将(0, 1)
添加进去,因为当我们的差值为0
时,说明当前的元素可以组成长度为1的子数组。
4.开始遍历数组,并且当我们的差值在哈希表中出现时,将其值加入到结果中,最后别忘了更新键值对。
class Solution {
public int subarraySum(int[] nums, int k) {
int n = nums.length;
int ans = 0, sum = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
for (int i = 0; i < n; i++) {
sum += nums[i];
if (map.containsKey(sum - k)) {
ans += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return ans;
}
}