Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16,
...) which sum to n. For example, given n = 12 , return 3 because 12 = 4 + 4 + 4 ; given n =
13 , return 2 because 13 = 4 + 9 .
题目翻译: 给出一个正整数 n ,求至少需要多少个完全平方数(例如1,4,9,16……)相加能得到n。
例如,给出 n = 12 ,返回3,因为 12 = 4 + 4 + 4 。给出 n = 13 ,返回2,因为 13 = 4 + 9 。
具体来说,我们用一个数组来记录已有的结果,初始化为正无穷( INT_MAX )。外层循环变量 i 从 0 到 n ,
内层循环变量 j 在 i 的基础上依次加上每个整数的完全平方,超过 n 的不算。那么 i + j*j 这个数需要
的最少的完全平方数的数量,就是数组中当前的数值,和 i 位置的数值加上一,这两者之间较小的数字。
如果当前的值较小,说明我们已经找到过它需要的完全平方数的个数(最初都是正无穷)。否则的话,说
明在 i 的基础上加上 j 的平方符合条件,所需的完全平方数的个数就是 i 需要的个数加上一。
import java.util.Arrays;
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 0; i <= n; i++) {
for (int j = 1; i + j * j <= n; j++) {
dp[i + j * j] = Math.min(dp[i + j * j], dp[i] + 1);
}
}
return dp[n];
}
public static void main(String[] args) {
Solution s = new Solution();
int n = s.numSquares(8);
System.out.println(n);
}
};