diff --git a/go/make-sum-divisible-by-p.go b/go/make-sum-divisible-by-p.go new file mode 100644 index 0000000..e406d3f --- /dev/null +++ b/go/make-sum-divisible-by-p.go @@ -0,0 +1,40 @@ +package main + +func minSubarray(nums []int, p int) int { + getTotalRemainder := func() int { + total := 0 + for _, x := range nums { + total = (total + x) % p + } + return total + } + target := getTotalRemainder() + + // whole array is divisible by p + if target == 0 { + return 0 + } + + mods := make(map[int]int) + mods[0] = -1 + + runningRemainder, foundMinimum := 0, len(nums) + for i, x := range nums { + runningRemainder = (runningRemainder + x) % p + + complement := (runningRemainder + p - target) % p + length, found := mods[complement] + if found { + foundMinimum = min(foundMinimum, i-length) + } + + mods[runningRemainder] = i + } + + // didn't find any solution + if foundMinimum == len(nums) { + return -1 + } + + return foundMinimum +}