题干:
给你一个整数数组 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
解题思路:
- 暴力法
O(n^2)
尝试使用暴力法,第一次运气比较好,居然通过了。但是再提交就提示超出时间限制了。
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var subarraySum = function(nums, k) {
let result = 0;
for (let i = 0; i < nums.length; i++) {
let acc = 0;
for (let j = i; j < nums.length; j++) {
acc += nums[j];
if (acc === k) {
result++;
}
}
}
return result;
};
暴力法是两重循环,我们是否有方案,能减少循环的次数,让他们提前退出呢?
- 这个思路貌似行不通,因为我们不能改变数组的顺序,而数组本身也是没有顺序的,我们没法在遍历到下一个item之前就判断当前的遍历绝对不能成功。
- 但是很明显,我们做了很多重复的工作。
如何求解???
奇怪,看了官方的题解后,发现官方也是暴力求解,然而居然通过了?
那么有没有其他更优秀的解法呢?