560. 和为 K 的子数组

中等 · 哈希表

题目

560. 和为 K 的子数组 官方题解

枚举遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int res = 0;
        for (int i = 0; i < nums.size(); i ++) {
            int sum = 0;
            for (int j = i; j < nums.size(); j ++ ) {
                sum += nums[j];
                if (sum == k) {
                    res ++;
                }
            }
        }

        return res;
    }
};

时间复杂度:O(n^2)

空间复杂度:O(1)

测试用例:92 / 93

前缀和 + 哈希表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> mp;
        mp[0] = 1;
        int count = 0, pre = 0;
        for (auto& x:nums) {
            pre += x;
            if (mp.find(pre - k) != mp.end()) {
                count += mp[pre - k];
            }
            mp[pre]++;
        }
        return count;
    }
};

时间复杂度:O(n)

空间复杂度:O(n)