题目概览
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k的子数组的个数。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 <= nums.length <= 2 * 104-1000 <= nums[i] <= 1000-107 <= k <= 107
来源:560. 和为 K 的子数组 - 力扣(LeetCode)
解题分析
方法:前缀和 + 哈希
和为 k 的连续子数组可以看做一个大的连续数组 减去 前面小的一个连续数组,如:nums = 1,1,2, k = 3, 可以看做 1,1,2 减去 1,因此我们可以令当前索引为 i,0 到 i 的数字之和即 前缀和 为 pre i ,需要减去的前缀和为 pre j ,那么可以得到:pre i - pre j = k,转换一下就是 pre j = pre i - k,由于 j 一定小于 i,我们可以定义哈希map,遍历 nums 并存储前缀和即 pre j ,当有 pre i - k 在哈希map中时,记录个数即可。
时间复杂度:O(n)
空间复杂度:O(n)
java
class Solution {
public int subarraySum(int[] nums, int k) {
int result = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int sum = 0;
for (int num: nums) {
sum += num;
if (map.containsKey(sum - k)) {
result += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return result;
}
}