diff --git a/src/main/java/com/cool/hot100/dp/Num279.java b/src/main/java/com/cool/hot100/dp/Num279.java index 6d0a90c..b069583 100644 --- a/src/main/java/com/cool/hot100/dp/Num279.java +++ b/src/main/java/com/cool/hot100/dp/Num279.java @@ -2,6 +2,8 @@ package com.cool.hot100.dp; import org.junit.Test; +import java.util.Arrays; + /** * Created with IntelliJ IDEA. * @@ -13,8 +15,52 @@ import org.junit.Test; */ public class Num279 { + private static final int[][] memory = new int[101][10001]; +// +// static { +// for (int[] row : memory) { +// Arrays.fill(row, -1); // -1 表示没有计算过 +// } +// } + + static { + for (int[] row : memory) { + Arrays.fill(row, Integer.MAX_VALUE); // -1 表示没有计算过 + } + memory[0][0] = 0; + } public int numSquares(int n) { + for (int i = 1; i * i <= n; i++) { + for (int j = 0; j <= n; j++) { + if (j < i * i) { + memory[i][j] = memory[i - 1][j]; + } else { + memory[i][j] = Math.min(memory[i - 1][j], memory[i][j - i * i] + 1); + } + } + } + return memory[(int) Math.sqrt(n)][n]; } + + + public int numSquares1(int n) { + return dfs((int) Math.sqrt(n), n); + } + + // i是指j比哪些i的平方大,j为当前数字 + private int dfs(int i, int j) { + if (i == 0) { + return j == 0 ? 0 : Integer.MAX_VALUE; + } + if (memory[i][j] != -1) { + return memory[i][j]; + } + if (i * i > j) { + return memory[i][j] = dfs(i - 1, j); + } + return memory[i][j] = Math.min(dfs(i - 1, j), dfs(i, j - i * i) + 1); + } + }