题解 | #最少的完全平方数#

最少的完全平方数

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];
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务