Make Sum Divisible by P

MediumArrayHash TablePrefix Sum

Solution

export function minSubarray(nums: number[], p: number): number {
  const target = nums.reduce((acc, num) => acc + num, 0) % p;
  if (target === 0) {
    return 0;
  }
 
  const n = nums.length;
  const dp = new Map<number, number>([[0, -1]]);
  let answer = n;
  let prefixSum = 0;
  for (let i = 0; i < n; i++) {
    prefixSum += nums[i];
    const prevIndex = dp.get(((prefixSum % p) - target + p) % p);
    if (prevIndex !== undefined) {
      answer = Math.min(answer, i - prevIndex);
    }
    dp.set(prefixSum % p, i);
  }
  return answer < n ? answer : -1;
}

Complexity

  • Time: O(N)
  • Space: O(N)