LeetCode_前缀和_中等_560.和为 K 的子数组

x33g5p2x  于2022-02-11 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(258)

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k

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;
}

相关文章