给你一个整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
(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 的连续子数组的个数即可。
//思路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;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43004044/article/details/122873498
内容来源于网络,如有侵权,请联系作者删除!