和为 K 的子数组
- 原题链接
 - 思路
 - 代码
 
原题链接
leet hot 100-10
 560. 和为 K 的子数组
 
 
思路
看到连续非空数组 想到前缀和数组 首先记录前缀和 然后从前往后运算 计算当前位置的前缀和的大小 减少k个 那么这个数字在前缀和的数组中有多少时间复杂度O(n) 空间复杂度(n)
代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> sum(n+1); //来保存n+1个前缀和
        for(int i =1 ;i<=n ;i++) sum[i] = sum[i-1]+nums[i-1] ;
        unordered_map<int ,int> st; //来保存前缀和数组中 每个值出现的次数
        st[0] =1;//表示前缀和为0的数组为1
        int res = 0;
        for(int i =1 ;i<=n ;i++)
        {
            res += st[sum[i] - k]; //sum[i]-k表示当前位置的前缀和减去k的大小 然后查看保存前缀和数组中是否有当前的值
            st[sum[i]]++;
        }
        return res;
    }
};
                


















