LeetCode 560.和为 K 的子数组(中等)
原创
©著作权归作者所有:来自51CTO博客作者菜籽爱编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述
给你一个整数数组 nums
和一个整数 k
,请你统计并返回该数组中和为 k
的连续子数组的个数。
示例 1
输入:nums = [1,1,1], k = 2
输出:2
示例 2
输入:nums = [1,2,3], k = 3
输出:2
提示
- 1 <= nums.length <= 2 *
- -1000 <= nums[i] <= 1000
- - <= k <=
题目分析
这道题我们同样可以使用前缀和的思路求解,首先还是创建一个前缀和数组,循环遍历原数组计算前缀和。然后我们可以运用双指针的思路,遍历前缀和数组,当右指针指向的元素减去左指针指向的元素刚好为 k
时,证明存在一个连续的区间满足题意。但此解法时间复杂度为
题解
执行用时: 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)