Skip to content

Commit c97d53b

Browse files
committed
Day 27 - Perfect Squares
1 parent 9db6920 commit c97d53b

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.kishan.scala.leetcode.juneChallenges
2+
3+
/*
4+
* Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.
5+
* */
6+
7+
8+
/*
9+
* Input: n = 12
10+
Output: 3
11+
Explanation: 12 = 4 + 4 + 4.
12+
*
13+
* Input: n = 13
14+
Output: 2
15+
Explanation: 13 = 4 + 9.
16+
*
17+
* */
18+
19+
/*
20+
* Approach: Dynamic Programming
21+
*
22+
* Assume we want to find the numSquares for 13. Below will be iterations.
23+
* Intially for each value the value it self will be the possible value. i.e for 4 = 1^2 + 1^2 + 1^2 + 1^2
24+
*
25+
* dp = [0,0,0,0,0,0,0,0,0,0,0,0,0,0]
26+
* dp(0) -> 0
27+
* dp(1) -> 1 and inner loop dp(1) -> min(dp(1), 1 + dp(1 - 1*1)) -> 1
28+
* dp(2) -> 2 and inner loop dp(2) -> min(dp(2), 1 + dp(2 - 1*1)) -> 2
29+
* dp(3) -> 3 and inner loop dp(3) -> min(dp(3), 1 + dp(3 - 1*1)) -> 3
30+
* dp(4) -> 4 and inner loop dp(4) -> min(dp(4), 1 + dp(4 - 1*1)) -> 4, dp(4) -> min(dp(4), 1 + dp(4 - 2*2)) -> 1
31+
* dp(5) -> 5 and inner loop dp(5) -> min(dp(5), 1 + dp(5 - 1*1)) -> 2, dp(5) -> min(dp(5), 1 + dp(5 - 2*2)) -> 2
32+
* dp(6) -> 6 and inner loop dp(6) -> min(dp(6), 1 + dp(6 - 1*1)) -> 3, dp(6) -> min(dp(6), 1 + dp(6 - 2*2)) -> 3
33+
* dp(7) -> 7 and inner loop dp(7) -> min(dp(7), 1 + dp(7 - 1*1)) -> 4, dp(7) -> min(dp(7), 1 + dp(7 - 2*2)) -> 4
34+
* dp(8) -> 8 and inner loop dp(8) -> min(dp(8), 1 + dp(8 - 1*1)) -> 5, dp(8) -> min(dp(8), 1 + dp(8 - 2*2)) -> 2
35+
* dp(9) -> 9 and inner loop dp(9) -> min(dp(9), 1 + dp(9 - 1*1)) -> 3, dp(9) -> min(dp(9), 1 + dp(9 - 2*2)) -> 3, , dp(9) -> min(dp(9), 1 + dp(9 - 3*3)) -> 1
36+
* dp(10) -> 10 and inner loop dp(10) -> min(dp(10), 1 + dp(10 - 1*1)) -> 2, dp(10) -> min(dp(10), 1 + dp(10 - 2*2)) -> 2, , dp(10) -> min(dp(10), 1 + dp(10 - 3*3)) -> 2
37+
* dp(11) -> 11 and inner loop dp(11) -> min(dp(11), 1 + dp(11 - 1*1)) -> 3, dp(11) -> min(dp(11), 1 + dp(11 - 2*2)) -> 3, , dp(11) -> min(dp(11), 1 + dp(11 - 3*3)) -> 3
38+
* dp(12) -> 12 and inner loop dp(12) -> min(dp(12), 1 + dp(12 - 1*1)) -> 4, dp(12) -> min(dp(12), 1 + dp(12 - 2*2)) -> 3, , dp(12) -> min(dp(12), 1 + dp(12 - 3*3)) -> 3
39+
* dp(13) -> 13 and inner loop dp(13) -> min(dp(13), 1 + dp(13 - 1*1)) -> 4, dp(13) -> min(dp(13), 1 + dp(13 - 2*2)) -> 2, , dp(12) -> min(dp(12), 1 + dp(13 - 3*3)) -> 2
40+
*
41+
*
42+
* Finally, we will return the n'th value of the dp which will be the result
43+
* */
44+
45+
46+
object PerfectSquares {
47+
def main(args: Array[String]): Unit = {
48+
val result = numSquares(13)
49+
println(s"Result: ${result}, ${result == 3}")
50+
}
51+
52+
def numSquares(n: Int): Int = {
53+
var dp: Array[Int] = Array.ofDim[Int](n + 1)
54+
for (i <- dp.indices) {
55+
dp(i) = i
56+
var j = 1
57+
while (j * j <= i) {
58+
dp(i) = math.min(dp(i), 1 + dp(i - j * j))
59+
j += 1
60+
}
61+
}
62+
return dp(n)
63+
}
64+
}

0 commit comments

Comments
 (0)