题解 | #最少的完全平方数#
最少的完全平方数
http://www.nowcoder.com/practice/51d0403bd98c425a887c26bb1816043e
动态规划,JavaScript版本
思路:
对小于n的每一个数都计算出其最优的平方数个数,从1->n依次计算,并且依据之前的结果来计算当前最优的平方数个数,优先解决子问题并利用子问题结果计算最终结果。
JavaScript代码如下:
const numSquares = (n) => {
// write code here
const LimitedNumber = Math.ceil(Math.sqrt(n));
const DPMap = new Map();
const DPMapReflect = new Map();
for (let i = 1; i <= LimitedNumber; i++) {
let value = Math.pow(i, 2);
DPMap.set(i, value);
DPMapReflect.set(value, i);
}
let dp = n > 4 ? new Array(n + 1) : new Array(5);
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
dp[4] = 1;
for (let val = 5; val <= n; val++) {
if (DPMapReflect.get(val)) {
dp[val] = 1;
} else {
let minSelectAmount = Number.MAX_SAFE_INTEGER;
for (let eachDPval = 1; eachDPval < val; eachDPval++) {
if (DPMap.get(eachDPval)) {
let restVal = val - DPMap.get(eachDPval);
if (restVal > 0) {
if (dp[restVal] + 1 < minSelectAmount) {
minSelectAmount = dp[restVal] + 1;
}
} else {
break;
}
}
}
dp[val] = minSelectAmount;
}
}
return dp[n];
}