动态规划
i - j * j尝试所有小于i的元素的完全平方数,dp[i - j * j] + 1来更新当前的次数
状态转移方程
dp[i] = Math.min(dp[i], dp[i - j * j] + 1)
var numSquares = function(n) {
// 创建一个长度为 n+1 的 dp 数组,并初始化为正无穷大
let dp = new Array(n + 1).fill(Infinity);
// 0 需要 0 个完全平方数
dp[0] = 0;
// 从 1 遍历到 n
for (let i = 1; i <= n; i++) {
// 尝试所有小于等于 i 的完全平方数
for (let j = 1; j * j <= i; j++) {
dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
}
}
// 返回 dp[n],即组成 n 的最少完全平方数个数
return dp[n];
};