leetcode 完美正方形,使用 2D dp,结果不正确 [已关闭]

leetcode perfect square, using 2D dp, result incorrect outcome [closed]

提问人:kenpeter 提问时间:11/17/2023 最后编辑:kenpeter 更新时间:11/17/2023 访问量:26

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

6天前关闭。

我试图为完美的正方形提出一个 2D dp 解决方案

根据此解决方案,我注释掉了 2 行代码,它们正在工作

我的问题是:

难道我们不应该像dp[i-1][j]一样将第一维修改为i-1吗?

为什么要修改dp[i][j-1]?

以下代码未通过任何测试用例

/**
 * @param {number} n
 * @return {number}
 */
var numSquares = function(n) {
    const tar = Math.floor(Math.sqrt(n));

    // * b: outloop each_item
    // * b: inner loop tar
    const dp = new Array(1+n).fill(0).map((_, i) => {
        return new Array(tar+1).fill(0);
    });
    
    // * b: tar = 0, inf (why not zero or 1)
    for (let i = 1; i <= n; i++) {
        dp[i][0] = Infinity;
    }

    // * b: 1 -> n (each item)
    for(let i=1; i<=n; ++i) {
        // * b: tar -> 1 (tar)
        for(j=1; j<=tar; ++j) {
            if(j*j <= i) {
                // dp[i][j] = Math.min(1 + dp[i - j * j][j], dp[i][j - 1]); // working
                dp[i][j] = Math.min(1 + dp[i-1][i - j * j], dp[i-1][j]); // not_working
            } else {
                //dp[i][j] = dp[i][j - 1]; // working
                dp[i][j] = dp[i-1][j]; // not_working
            }
            
        }
    }

    return dp[n][tar];
};

以下代码通过所有测试用例

/**
 * @param {number} n
 * @return {number}
 */
var numSquares = function(n) {
    const tar = Math.floor(Math.sqrt(n));

    // * b: outloop each_item
    // * b: inner loop tar
    const dp = new Array(1+n).fill(0).map((_, i) => {
        return new Array(tar+1).fill(0);
    });
    
    // * b: tar = 0, inf (why not zero or 1)
    for (let i = 1; i <= n; i++) {
        dp[i][0] = Infinity;
    }

    // * b: 1 -> n (each item)
    for(let i=1; i<=n; ++i) {
        // * b: tar -> 1 (tar)
        for(j=1; j<=tar; ++j) {
            if(j*j <= i) {
                dp[i][j] = Math.min(1 + dp[i - j * j][j], dp[i][j - 1]); // working
            } else {
                dp[i][j] = dp[i][j - 1]; // working
            }
            
        }
    }

    return dp[n][tar];
};

不确定代码的哪一部分出错了。

JavaScript 算法

评论


答: 暂无答案