LeetCode Notes_#560 和为k的子数组
Contents
题目

解答
最简单的思路就是暴力法,遍历所有连续子数组,检查是否满足和为K,如果是则计数器增加1。这样的复杂度是O(n2),由于输入数组是比较大的,所以暴力法是过不了的。
方法1:前缀和+哈希表
class Solution {
public int subarraySum(int[] nums, int k) {
//map保存的是前缀和出现的次数,key是前缀和,value是次数
HashMap<Integer, Integer> map = new HashMap<>();
//参考labuladoong的题解,这里是因为前缀和数组是比nums数组多出一位,所以要额外进行一次初始化
map.put(0,1);
//sum表示前缀和,在循环过程中不断的累加更新,count表示和为k的子数组的个数,同样是一边循环一边更新
int sum = 0, count = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
if(map.containsKey(sum - k)){
count += map.get(sum - k);
}
//统计前缀和的次数
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
}
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)