
import java.util.HashMap;
public class Solution {
/**
* 统计和为k的连续子数组个数
* @param nums 整数数组
* @param k 目标和
* @return 符合条件的子数组个数
*/
public int subarraySum(int[] nums, int k) {
// count:记录最终符合条件的子数组个数
int count = 0;
// pre:记录当前的前缀和(前i个元素的和)
int pre = 0;
// 哈希表:key=前缀和值,value=该前缀和出现的次数
HashMap<Integer, Integer> mp = new HashMap<>();
// 初始化:前缀和为0的情况出现1次(对应子数组从下标0开始的情况)
mp.put(0, 1);
// 遍历数组,计算前缀和并统计
for (int i = 0; i < nums.length; i++) {
// 累加当前元素,更新前缀和
pre += nums[i];
// 若哈希表中存在pre - k,说明存在j使得pre[i] - pre[j-1] = k,累加其出现次数
if (mp.containsKey(pre - k)) {
count += mp.get(pre - k);
}
// 将当前前缀和存入哈希表,若已存在则次数+1,否则设为1
mp.put(pre, mp.getOrDefault(pre, 0) + 1);
}
// 返回结果
return count;
}
}
import java.util.HashMap;
public class Solution {
/**
* 统计和为k的连续子数组个数
* @param nums 整数数组
* @param k 目标和
* @return 符合条件的子数组个数
*/
public int subarraySum(int[] nums, int k) {
// count:记录最终符合条件的子数组个数
int count = 0;
// pre:记录当前的前缀和(前i个元素的和)
int pre = 0;
// 哈希表:key=前缀和值,value=该前缀和出现的次数
HashMap<Integer, Integer> mp = new HashMap<>();
// 初始化:前缀和为0的情况出现1次(对应子数组从下标0开始的情况)
mp.put(0, 1);
// 遍历数组,计算前缀和并统计
for (int i = 0; i < nums.length; i++) {
// 累加当前元素,更新前缀和
pre += nums[i];
// 若哈希表中存在pre - k,说明存在j使得pre[i] - pre[j-1] = k,累加其出现次数
if (mp.containsKey(pre - k)) {
count += mp.get(pre - k);
}
// 将当前前缀和存入哈希表,若已存在则次数+1,否则设为1
mp.put(pre, mp.getOrDefault(pre, 0) + 1);
}
// 返回结果
return count;
}
}
复杂度分析
时间复杂度:O (n),其中 n 是数组长度。仅需遍历数组一次,哈希表的查询和插入操作均为 O (1)。
空间复杂度:O (n),哈希表最多存储 n 个不同的前缀和(极端情况如数组元素全为正数,前缀和唯一)。