和为k的子数组
理解题目:
题目要求在给定的整数数组中,找出和为给定值 k 的连续子数组的个数。
代码实现:
import java.util.HashMap;
import java.util.Map;
public class SubarraySumEqualsK {
// 找出和为 k 的子数组个数
public int subarraySum(int[] nums, int k) {
int count = 0; // 记录符合条件的子数组个数
int sum = 0; // 记录当前子数组的和
Map<Integer, Integer> prefixSumFreq = new HashMap<>(); // 存储前缀和出现的频率
prefixSumFreq.put(0, 1); // 初始前缀和为0的频率为1
// 遍历数组,计算当前的前缀和,并统计符合条件的子数组个数
for (int num : nums) {
sum += num; // 计算当前子数组的和
// 如果前缀和为 sum - k 的子数组存在,则说明找到一个符合条件的子数组
if (prefixSumFreq.containsKey(sum - k)) {
count += prefixSumFreq.get(sum - k); // 更新符合条件的子数组个数
}
// 更新当前前缀和的频率
prefixSumFreq.put(sum, prefixSumFreq.getOrDefault(sum, 0) + 1);
}
return count;
}
}
步骤解释:
1. 初始化变量 count
为0,用于记录符合条件的子数组个数,sum
为0,用于记录当前子数组的和。
2. 创建一个哈希表 prefixSumFreq
,用于存储前缀和出现的频率,初始化时将前缀和为0的频率设置为1。
3. 遍历数组 nums
,计算当前的前缀和 sum
,并统计符合条件的子数组个数。
4. 如果 prefixSumFreq
中存在前缀和为 sum - k
的键值对,则说明找到一个符合条件的子数组,更新 count
。
5. 更新当前前缀和 sum
的频率,即将 sum
对应的频率加1。
6. 返回符合条件的子数组个数 count
。
时间复杂度:遍历一次数组,时间复杂度为 O(n)。
空间复杂度:使用了哈希表来存储前缀和及其出现的频率,最坏情况下需要存储整个数组的前缀和,空间复杂度为 O(n)。