560. 和为 K 的子数组
思路
- 前缀和:我们维护一个当前的累计和
prefixSum,表示从数组起始位置到当前位置前的所有元素之和。 - 哈希表:我们使用一个哈希表
prefixSumCount来记录每种前缀和出现的次数。 - 如果存在某个前缀和
prefixSum - k,说明从那个位置到当前位置的和正好是k。我们就将结果加上prefixSumCount.get(prefixSum - k)。 - 如图,红色框内的部分就是我们需要统计的字串,
prefixSum刚好等于k时,那么从0到当前位置的字串符合条件,所以要初始化一个前缀和为0,出现1次的键值对。


复杂度分析
-
时间复杂度:
O(n) :每个元素只遍历一次。
-
空间复杂度 :
O(n) :哈希表最多存储 n 个不同的前缀和。
代码
import java.util.HashMap;
public class SubarraySumEqualsK {
public int subarraySum(int[] nums, int k) {
// 哈希表记录前缀和出现的次数
HashMap<Integer, Integer> prefixSumCount = new HashMap<>();
prefixSumCount.put(0, 1); // 初始前缀和为0,出现一次
int count = 0; // 记录满足条件的子数组个数
int prefixSum = 0; // 当前前缀和
for (int num : nums) {
prefixSum += num;
// 检查是否存在 prefixSum - k
if (prefixSumCount.containsKey(prefixSum - k)) {
count += prefixSumCount.get(prefixSum - k);
}
// 更新当前 prefixSum 出现的次数
prefixSumCount.put(prefixSum, prefixSumCount.getOrDefault(prefixSum, 0) + 1);
}
return count;
}
}

浙公网安备 33010602011771号