目录
1.题目
给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
2.思路
(1)前缀和
① 使用前缀和数组 preSum 记录 nums[0…i-1] 的累加和,即preSum[i]=nums[0]+…+nums[i-1];
② 用变量 cnt 记录数组 nums 中和为k的连续子数组的个数,初始值为 0;
③ preSum[j] - preSum[i] 即为数组 nums 中连续子数组 [i,j] 的和,遍历所有的子数组进行判断,最终返回和为 k 的连续子数组的个数即可。
3.代码实现(Java)
//思路1————前缀和
public int subarraySum(int[] nums, int k) {
/*
前缀和数组preSum记录nums[0..i-1]的累加和
preSum[i]=nums[0]+...+nums[i-1]
*/
int length = nums.length + 1;
int[] preSum = new int[length];
//计算数组nums的累加和
for (int i = 1; i < length; i++) {
preSum[i] = preSum[i - 1] + nums[i - 1];
}
//cnt记录数组nums中和为k的连续子数组的个数
int cnt = 0;
for (int i = 0; i < length - 1; i++) {
for (int j = i+1; j < length; j++) {
//preSum[j] - preSum[i]即为数组nums中连续子数组[i,j]的和
if (preSum[j] - preSum[i] == k) {
cnt++;
}
}
}
return cnt;
}