一、题目
给你一个整数数组 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 <= 10
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
二、思路
提示中出现了10的4方,暴力解法可能会超时。由于题目中出现“和”的子样,考虑前缀和。
前缀和数组也有两种方式定义分别是len和len+1。
class Solution {
public int subarraySum(int[] nums, int k) {
int len = nums.length;
//前缀和两种定义方式: 大小为nums + 1,索引是0的存储0
int[] preSum = new int[len + 1];
preSum[0] = 0;
for (int i = 0; i < len; i++) {
preSum[i + 1] = nums[i] + preSum[i];
}
int count = 0;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j <= len;j++ ){
if (preSum[j] - preSum[i] == k){
count++;
}
}
}
return count;
}
}