1、题目描述
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。需要让组成和的完全平方数的个数最少,求使用完全平方数的个数。
2、解题思路
1、申请一个数组空间,长度为 n+1
2、默认设置最差情况,即所有给定值都是由1相加而成
3、寻找可用的 j*j 作为完全平方数,需要满足条件 i - j * j >= 0
4、比较与全部使用1作为加数和较小的 j 时所用数量,取最小值
4.1、将该值赋值给数值空间中对应的 i 表示组合成 i 的最优情况
4.2、此后再计算较大数组合最优情况时可以直接使用前面较小数
4.3、待遍历结束后生成的空间数组为从 0 到给定值 n 使用完全平方数相加的最少数量
5、返回空间数组中 n 对应值,即为所求用完全平方数相加得 n 的最少数量
3、解题代码
/**
* @param {number} n
* @return {number}
*/
var numSquares = function(n) {
const arr = [...Array(n+1)].map(e=>0);
for (let i = 1; i <= n; i++) {
arr[i] = i;
for (let j = 1; i - j * j >= 0; j++) {
arr[i] = Math.min(arr[i], arr[i - j * j] + 1);
}
}
return arr[n];
};