Subarray Sum Equals K

Published: Oct 26, 2022

Medium Prefix Sum Hash Table Array

Introduction

The problem gives us an array and asks about sum which is k. This signals the prefix sum and hash table. It is a kind of 2-sum problem. That’s why the hash table works. The keys of the hash table are accumulated sums. While going over the given array, if accumulated sum minus k exists in the table, the sum equals to k is found.

Problem Description

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

A subarray is a contiguous non-empty sequence of elements within an array.

Constraints:

  • 1 <= nums.length <= 2 * 10**4
  • -1000 <= nums[i] <= 1000
  • -10**7 <= k <= 10**7

https://leetcode.com/problems/subarray-sum-equals-k/

Examples

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

Analysis

The solution here starts from initializing the accumulated value and hash table. The value of the hash table is a number of times the accumulated value appeared. So, the initial value is sum 0 and count 1. While checking the array value one by one, find accumulated value minus k. Like 2-sum problem, the accumulated sum minus k exists in the hash table, add up the count. Then, count up at the current accumulated sum.

Solution

class SubarraySumEqualsK:
    def subarraySum(self, nums: List[int], k: int) -> int:
        acc, memo = 0, {0: 1}
        count = 0
        for v in nums:
            acc += v
            diff = acc - k
            if diff in memo:
                count += memo[diff]
            if acc in memo:
                memo[acc] += 1
            else:
                memo[acc] = 1
        return count

Complexities

  • Time: O(n)
  • Space: O(n)