560. 和为 K 的子数组
解题思路
- 创建一个前缀和数组 preSum,其长度比原数组 nums 多 1。preSum[i] 表示 nums 中前 i 个元素的和。
- 通过遍历 nums 数组,计算前缀和数组 preSum。
- 在嵌套的两个循环中,对所有可能的子数组进行穷举:
- 外层循环从 1 到 n(n 是数组长度),代表子数组的结束位置。
- 内层循环从 0 到 i-1,代表子数组的起始位置。
- 在每一对起始位置和结束位置上,通过计算前缀和数组中的差值,判断子数组的和是否等于 k。
- 如果等于 k,则将结果计数器 ans 加一。
java
class Solution {
public int subarraySum(int[] nums, int k) {
// 前缀和数组
int n = nums.length;
int[] preSum = new int[n + 1];
preSum[0] = 0;
for(int i = 0; i < n; i++){
preSum[i + 1] = preSum[i] + nums[i];
}
// preSum[i] 代表nums[0...i - 1]的和
int ans = 0;
// 穷举所有子数组
for(int i = 1; i <= n; i++){
for(int j = 0; j < i; j++){
if(preSum[i] - preSum[j] == k){
ans++;
}
}
}
return ans;
}
}