和为K的子数组(前缀和+mp)

给你一个整数数组\(nums\)和一个整数\(k\),请你统计并返回 该数组中和为\(k\)的子数组的个数。子数组是数组中元素的连续非空序列。

示例 1:
输入:nums = [1,1,1], k = 2
输出:2

示例 2:
输入:nums = [1,2,3], k = 3
输出:2

提示:
\(1 <= nums.length <= 2 * 10^4\)
-1000 <= nums[i] <= 1000
\(-10^7 <= k <= 10^7\)

这个题是前缀和+mp的题,
我们用前缀和看就是sun[j]-sum[i]=k,我们从0开始用map将前缀和mp[sum[i]]++,我们对于一个j,我们只需要看看前面有几个sum[i],然后就是ans+=mp[sum[j]-k]就行

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int ans=0;
        int n=nums.size(),sum=0;
        map<int,int>mp;
        mp[0]=1;
        for(int i=0;i<n;i++){
            sum+=nums[i];
            if(mp[sum-k]){
                ans+=mp[sum-k];
            }
            mp[sum]++;
        }
        return ans;
    }   
};
posted @ 2023-11-12 20:30  lipu123  阅读(40)  评论(0)    收藏  举报