Maximum Size Subarray Sum Equals k

medium prefix sum hash map

Problem

Given an array of integers nums and a target k, return the maximum length of a contiguous subarray summing to k.

Inputnums = [1,-1,5,-2,3], k = 3
Output4
Subarray [1,-1,5,-2] has length 4 with sum 3.

def max_subarray_len(nums, k):
    first = {0: -1}
    s = 0; best = 0
    for i, x in enumerate(nums):
        s += x
        if s - k in first:
            best = max(best, i - first[s - k])
        if s not in first:
            first[s] = i
    return best
function maxSubArrayLen(nums, k) {
  const first = new Map(); first.set(0, -1);
  let s = 0, best = 0;
  for (let i = 0; i < nums.length; i++) {
    s += nums[i];
    if (first.has(s - k)) best = Math.max(best, i - first.get(s - k));
    if (!first.has(s)) first.set(s, i);
  }
  return best;
}
class Solution {
    public int maxSubArrayLen(int[] nums, int k) {
        Map first = new HashMap<>();
        first.put(0, -1);
        int s = 0, best = 0;
        for (int i = 0; i < nums.length; i++) {
            s += nums[i];
            if (first.containsKey(s - k)) best = Math.max(best, i - first.get(s - k));
            first.putIfAbsent(s, i);
        }
        return best;
    }
}
int maxSubArrayLen(vector& nums, int k) {
    unordered_map first; first[0] = -1;
    int s = 0, best = 0;
    for (int i = 0; i < (int)nums.size(); i++) {
        s += nums[i];
        if (first.count(s - k)) best = max(best, i - first[s - k]);
        if (!first.count(s)) first[s] = i;
    }
    return best;
}
Time: O(n) Space: O(n)