279.perfect-squares.go 346 B

12345678910111213141516171819
  1. func numSquares(n int) int {
  2. dp := make([]int, n+1)
  3. dp[0] = 1000000
  4. for i := 1; i < n+1; i *= 2 {
  5. copy(dp[i:], dp[:i])
  6. }
  7. for i := 1; i*i <= n; i++ {
  8. dp[i*i] = 1
  9. }
  10. for i := 1; i < n; i++ { // n(k) = n(i + j*j) = n(i) + 1
  11. for j := 1; i+j*j <= n; j++ {
  12. if dp[i]+1 < dp[i+j*j] {
  13. dp[i+j*j] = dp[i] + 1
  14. }
  15. }
  16. }
  17. return dp[n]
  18. }