560. 和为K的连续子数组

· 约 1 分钟阅读 · 次阅读 leetcode

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

 

示例 1:

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

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

提示:

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


暴力枚举, 无法通过OJ

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size(), ans = 0;
        for (int start = 0; start < n; start++) {
            int tmp = 0;
            for (int end = start; end < n; end++) {
                tmp += nums[end];
                if (tmp == k) ans++;
            }
        }
        return ans;

    }
};

前缀和+哈希表

记录pre[i]为序号为0-i的数组中所有数的和。 对于序号为[i, j]的子树组来说,如果pre[j]-pre[i-1] == k, 则其为一个目标答案。

可以考虑用一个哈希表记录所有前缀和出现的次数,遍历一次即可求得答案。

时间复杂度和空间复杂度均为O(n)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size(), ans = 0, pre = 0;
        unordered_map<int, int> mp;
        mp[0] = 1;
        for (int start = 0; start < n; start++) {
            pre += nums[start];
            if (mp.find(pre-k) != mp.end()) {
                ans += mp[pre-k];
            }
            mp[pre]++;
        }
        return ans;

    }
};