力扣热门100题之和为k的子数组【中等】

题目描述

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

执行情况
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33183456/article/details/131906107