Repository: vaskoz/dailycodingproblem-go (go)

Issue:
Day 156
Good morning! Here's your coding interview problem for today.

This problem was asked by Facebook.

Given a positive integer n, find the smallest number of squared integers which sum to n.

For example, given `n = 13`, return `2` since `13 = 32 + 22 = 9 + 4`.

Given `n = 27`, return `3` since `27 = 32 + 32 + 32 = 9 + 9 + 9`.

Pull request description:
Day156
Resolves #325.

Patch:
diff --git a/README.md b/README.md
index 7ca9728..b544125 100644
--- a/README.md
+++ b/README.md
@@ -166,3 +166,4 @@ problems from
 * [Day 153](https://github.com/vaskoz/dailycodingproblem-go/issues/316)
 * [Day 154](https://github.com/vaskoz/dailycodingproblem-go/issues/320)
 * [Day 155](https://github.com/vaskoz/dailycodingproblem-go/issues/322)
+* [Day 156](https://github.com/vaskoz/dailycodingproblem-go/issues/325)
diff --git a/day156/problem.go b/day156/problem.go
new file mode 100644
index 0000000..23d2e1e
--- /dev/null
+++ b/day156/problem.go
@@ -0,0 +1,44 @@
+package day156
+
+import (
+	"math"
+)
+
+// MinSquared returns the smallest number
+// of squared integers which sum to n.
+// Runs in exponential time.
+func MinSquared(n int) int {
+	return minSquared(n, 0, n)
+}
+
+func minSquared(n, level, minSoFar int) int {
+	if n <= 3 {
+		return n
+	}
+	end := int(math.Sqrt(float64(n))) + 1
+	for i := end; i > 0; i-- {
+		if x := i * i; x <= n {
+			if y := 1 + minSquared(n-x, level+1, minSoFar); y < minSoFar {
+				minSoFar = y
+			}
+		}
+	}
+	return minSoFar
+}
+
+// MinSquaredDP returns the smallest number
+// of squared integers which sum to n.
+// Runs in O(N^2) time and O(N) space.
+func MinSquaredDP(n int) int {
+	table := make([]int, 0, n+1)
+	table = append(table, 0, 1, 2, 3)
+	for i := 4; i <= n+1; i++ {
+		table = append(table, i)
+		for x := 1; x < i+1; x++ {
+			if v := x * x; v <= i && table[i-v]+1 < table[i] {
+				table[i] = table[i-v] + 1
+			}
+		}
+	}
+	return table[n]
+}


Test patch:
diff --git a/day156/problem_test.go b/day156/problem_test.go
new file mode 100644
index 0000000..43cdeaa
--- /dev/null
+++ b/day156/problem_test.go
@@ -0,0 +1,44 @@
+package day156
+
+import "testing"
+
+var testcases = []struct {
+	n, expected int
+}{
+	{13, 2},
+	{27, 3},
+}
+
+func TestMinSquared(t *testing.T) {
+	t.Parallel()
+	for _, tc := range testcases {
+		if result := MinSquared(tc.n); result != tc.expected {
+			t.Errorf("For N=%d Expected %v got %v", tc.n, tc.expected, result)
+		}
+	}
+}
+
+func BenchmarkMinSquared(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		for _, tc := range testcases {
+			MinSquared(tc.n)
+		}
+	}
+}
+
+func TestMinSquaredDP(t *testing.T) {
+	t.Parallel()
+	for _, tc := range testcases {
+		if result := MinSquaredDP(tc.n); result != tc.expected {
+			t.Errorf("For N=%d Expected %v got %v", tc.n, tc.expected, result)
+		}
+	}
+}
+
+func BenchmarkMinSquaredDP(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		for _, tc := range testcases {
+			MinSquaredDP(tc.n)
+		}
+	}
+}