From 5e5928bd8a514eb15d065d03995b456dba0526cc Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Thu, 3 Oct 2024 21:53:00 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB1590.=20Make=20Sum=20Divisibl?= =?UTF-8?q?e=20by=20P=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- go/make-sum-divisible-by-p.go | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 go/make-sum-divisible-by-p.go 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 +}