LeetCode 560.和为 K 的子数组(中等)_双指针

题目描述

LeetCode 560.和为 K 的子数组(中等)_前缀和_02


给你一个整数数组 ​​nums​​​ 和一个整数 ​​k​​​ ,请你统计并返回该数组中和为 ​​k​​ 的连续子数组的个数。

LeetCode 560.和为 K 的子数组(中等)_双指针

示例 1

LeetCode 560.和为 K 的子数组(中等)_前缀和_02


输入:nums = [1,1,1], k = 2
输出:2

LeetCode 560.和为 K 的子数组(中等)_双指针

示例 2

LeetCode 560.和为 K 的子数组(中等)_前缀和_02


输入:nums = [1,2,3], k = 3
输出:2

LeetCode 560.和为 K 的子数组(中等)_双指针

提示

LeetCode 560.和为 K 的子数组(中等)_前缀和_02


  • 1 <= nums.length <= 2 *
  • -1000 <= nums[i] <= 1000
  • - <= k <=

LeetCode 560.和为 K 的子数组(中等)_双指针

题目分析

LeetCode 560.和为 K 的子数组(中等)_前缀和_02


这道题我们同样可以使用前缀和的思路求解,首先还是创建一个前缀和数组,循环遍历原数组计算前缀和。然后我们可以运用双指针的思路,遍历前缀和数组,当右指针指向的元素减去左指针指向的元素刚好为 ​​k​​ 时,证明存在一个连续的区间满足题意。但此解法时间复杂度为

LeetCode 560.和为 K 的子数组(中等)_双指针

题解

LeetCode 560.和为 K 的子数组(中等)_前缀和_02


执行用时: 1515 ms

内存消耗: 43.5 MB

class Solution {
public int subarraySum(int[] nums, int k) {
// 获取数组长度
int length = nums.length;
// 前缀和数组
int[] pre = new int[length + 1];
// 计算前缀和
for (int i = 0; i < length; ++i) {
pre[i + 1] = pre[i] + nums[i];
}
// 符合区间个数
int count = 0;
// 双指针遍历计算符合区间个数
for (int left = 0; left < length; ++left) {
for (int right = left; right < length; ++right) {
if (pre[right + 1] - pre[left] == k) {
count++;
}
}
}
return count;
}
}

题目来源:力扣(LeetCode)