题干:

给你一个整数数组 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  

链接:https://leetcode.cn/problems/subarray-sum-equals-k/description/?envType=study-plan-v2&envId=top-100-liked

解题思路:

  1. 暴力法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之前就判断当前的遍历绝对不能成功。
  • 但是很明显,我们做了很多重复的工作。

如何求解???

奇怪,看了官方的题解后,发现官方也是暴力求解,然而居然通过了?

那么有没有其他更优秀的解法呢?