题目描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
解法1 暴力破解
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var subarraySum = function(nums, k) {
let count=0;
for(let i=0;i<nums.length;i++){
let sum=0;
for(let j=i;j>=0;j--){
sum+=nums[j];
if(sum==k){
count++;
}
}
}
return count;
};
执行情况
解法2 前缀和
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var subarraySum = function(nums, k) {
let count=0;
const pre=[]
let sum=0;
for(let i=0;i<nums.length;i++){
sum+=nums[i];
pre[i]=sum;
}
for(let i=0;i<pre.length;i++){
if(pre[i]==k)count++;
for(let j=0;j<i;j++){
if(pre[i]-pre[j]==k){
count++;
}
}
}
return count;
};
执行情况
前缀和+哈希
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var subarraySum = function(nums, k) {
let count=0;
let sum=0;
const data=new Map()
data.set(0,1);
for(let i=0;i<nums.length;i++){
sum+=nums[i];
if(data.has(sum-k)){
count+=data.get(sum-k);
}
data.set(sum,data.has(sum)?data.get(sum)+1:1);
}
return count;
};
执行情况