Skip to content

0560. Subarray Sum Equals K

Given an array of integers nums and an integer k, return the total number of continuous subarrays whose sum equals to k.

Example 1:

Input: nums = [1,1,1], k = 2
Output: 2

Example 2:

Input: nums = [1,2,3], k = 3
Output: 2

Constraints:

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

Analysis

We can reduce this to one for-loop to solve this problem. At any point, if we know how many subarrays in front of the current processing point have a sum equal to curr_sum - k, then we can solve this problem in one loop. In other words: curr_sum - x = k, where x is our target complement sum.

So we create a map for that, and keep a record of all the previous sums and their frequency.

  • Time: O(n)
  • Space: O(n), there could be at most n different sums

Code

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = (int)nums.size();
        // key: sum from 0 to i, value: # of this sum occurred
        unordered_map<int, int> m;
        int res = 0;
        int curr_sum = 0;
        m[0] = 1;
        for (int i = 0; i < n; ++i) {
            curr_sum += nums[i];
            res += m[curr_sum - k];
            m[curr_sum]++;
        }
        return res;
    }
};