560. 和为K的子数组 - 力扣(LeetCode) (leetcode-cn.com)
- 思路一:进行枚举
- 考虑以i结尾和正好为k的连续子数组的个数,就需要统计符合条件的下标j的个数,j∈[0,i]并且[j…i]这个子数组的和正好为k。
- 枚举[0…i]里所有的下标j来判断是否符合条件。
-
代码
public class Solution { public int subarraySum(int[] nums, int k) { int count = 0; //从前到后,再后到前进行求和计算。 for (int start = 0; start < nums.length; ++start) { int sum = 0; for (int end = start; end >= 0; --end) { sum += nums[end]; if (sum == k) { count++; } } } return count; } }
- 思路二:前缀和:
- 使用HashMap。key为每次遍历的前缀和,value是前缀和对应出现的次数。
- 最开的时候先put(0,1)表示前缀和为0的只有一个。
- 遍历的时候求和,然后看这个map中是否包含preSum - k这个key,有就相加。
- 不管是否有,都将每次的前缀和放入进map中。
- 代码:
class Solution {
public int subarraySum(int[] nums, int k) {
int n = nums.length;
//前缀和+HashMap
Map<Integer, Integer> preMap = new HashMap<>();
//先默认只有一个数能凑齐0
preMap.put(0,1);
int res = 0;
int preSum = 0;
for(int num : nums){
preSum += num;
if(preMap.containsKey(preSum - k)){
res += preMap.get(preSum - k);
}
preMap.put(preSum, preMap.getOrDefault(preSum, 0) + 1);
}
return res;
}
}