这是我的memory search方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | private int [] memo; private int recursionNumSquares( int n){ if (memo[n] == 0 ){ memo[n] = Integer.MAX_VALUE; for ( int i = 1 ; i < n; i ++){ if (i * i == n){ memo[n] = 1 ; break ; } else { memo[n] = Math.min(memo[n],recursionNumSquares(i)+recursionNumSquares(n-i)); } } } return memo[n]; } public int numSquares( int n) { memo = new int [n + 1 ]; memo[ 1 ] = 1 ; return recursionNumSquares(n); } |
这是我的动态规划解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public int numSquares( int n) { int [] memo = new int [n + 1 ]; Arrays.fill(memo, Integer.MAX_VALUE); memo[ 1 ] = 1 ; for ( int i = 2 ; i <= n; i ++){ for ( int j = 1 ; j < i; j ++){ if (j * j == i){ memo[i] = 1 ; break ; } else memo[i] = Math.min(memo[i], memo[j]+memo[i-j]); } } return memo[n]; } |
原因似乎是因为我使用了memo[i] = Math.min(memo[i], memo[j]+memo[i-j]), 而不是memo[i] = Math.min(memo[i], 1+memo[i-j * j])
我的问题是,我们似乎无法知道memo[i]一定就是1+memo[i - j*j],为什么不进行遍历,而是直接跳过很多值,选择了memo[i -j*j]?
我的解法结果是对的,只是超时了,这是截图:
谢谢老师!