560. 和为K的子数组
查看题目中等
数组
低频
解法一:前缀和
时间复杂度:O(n) | 空间复杂度:O(n) | 推荐使用
动画演示
准备就绪 - 输入数组和k值,然后点击开始
找到的子数组
暂无结果,点击开始按钮查看算法执行过程...
代码实现
// 和为K的子数组 - Java实现
// 算法:前缀和 + 哈希表
import java.util.HashMap;
public class Solution {
/**
* 计算和为k的子数组个数
* @param nums 输入数组
* @param k 目标和
* @return 和为k的子数组个数
*/
public int subarraySum(int[] nums, int k) {
// 计数器,记录和为k的子数组个数
int count = 0;
// 前缀和,记录从数组开始到当前位置的和
int pre = 0;
// 哈希表,记录前缀和出现的次数
HashMap < Integer, Integer > mp = new HashMap < > ();
// 初始化,前缀和为0的情况出现了1次
mp.put(0, 1);
// 遍历数组
for (int i = 0; i < nums.length; i++) {
// 更新前缀和
pre += nums[i];
// 检查是否存在前缀和为pre - k的情况
if (mp.containsKey(pre - k)) {
// 如果存在,累加对应的次数到结果
count += mp.get(pre - k);
}
// 更新哈希表,记录当前前缀和的出现次数
mp.put(pre, mp.getOrDefault(pre, 0) + 1);
}
return count;
}
}时间复杂度:O(n)
空间复杂度:O(n)
前缀和 + 哈希表:通过计算前缀和并使用哈希表记录出现次数,当遇到前缀和为当前前缀和减去k时,说明存在符合条件的子数组。