|
| 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