剑指 Offer II 010. 和为 k 的子数组

给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。

 

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2
解释: 此题 [1,1] 与 [1,1] 为两种不同的情况

示例 2 :

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

 

提示:

    1 <= nums.length <= 2 * 104
    -1000 <= nums[i] <= 1000

    -107 <= k <= 107

解析:

前缀和 + map

只需要记录前面有几个 presum - k 的位置即可

因为从这些位置到 i,这个连续子数组的和 == k

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        map<int, int> vis;
        int cnt = 0;
        int presum = 0;
        vis[presum] = 1;
        for(int i = 0; i < nums.size(); i++)
        {
            presum += nums[i];
            int temp = presum - k;
            if(vis[temp]) cnt += vis[temp];
            if(!vis[presum])
                vis[presum] = 1;
            else
                vis[presum]++;
        }
        return cnt;

    }
};

 

posted @ 2022-04-02 00:00  WTSRUVF  阅读(19)  评论(0编辑  收藏  举报