Continuous Subarray Sum

medium array hash map prefix sum

Problem

Return true iff nums has a contiguous subarray of length ≥ 2 whose sum is a multiple of k.

Inputnums = [23,2,4,6,7], k = 6
Outputtrue
Prefix mod sees the same remainder twice ≥ 2 apart → subarray sum is divisible by k.

def check_subarray_sum(nums, k):
    seen = {0: -1}
    s = 0
    for i, x in enumerate(nums):
        s = (s + x) % k
        if s in seen:
            if i - seen[s] >= 2: return True
        else:
            seen[s] = i
    return False
function checkSubarraySum(nums, k) {
  const seen = new Map([[0, -1]]);
  let s = 0;
  for (let i = 0; i < nums.length; i++) {
    s = (s + nums[i]) % k;
    if (seen.has(s)) { if (i - seen.get(s) >= 2) return true; }
    else seen.set(s, i);
  }
  return false;
}
class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        Map<Integer, Integer> seen = new HashMap<>();
        seen.put(0, -1);
        int s = 0;
        for (int i = 0; i < nums.length; i++) {
            s = (s + nums[i]) % k;
            if (seen.containsKey(s)) { if (i - seen.get(s) >= 2) return true; }
            else seen.put(s, i);
        }
        return false;
    }
}
bool checkSubarraySum(vector<int>& nums, int k) {
    unordered_map<int, int> seen{{0, -1}};
    int s = 0;
    for (int i = 0; i < (int)nums.size(); i++) {
        s = (s + nums[i]) % k;
        if (seen.count(s)) { if (i - seen[s] >= 2) return true; }
        else seen[s] = i;
    }
    return false;
}
Time: O(n) Space: O(min(n, k))