You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode Ones and Zeros问题:3D数组解法无法通过样例求助

LeetCode「1和0」问题3D DP解法排查

问题情况

我在解决LeetCode的「1和0」问题时,参考DP维度优化与填表顺序的思路实现了基于3D数组的动态规划解法,但无法通过样例测试。以下是我的代码、样例输入输出,请求排查问题:

我的代码

/**
 * @param {string[]} strs
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var findMaxForm = function(strs, m, n) {
    const len = strs.length;
    const dp = new Array(len+1).fill(0).map((_, i) => {
        return new Array(m+1).fill(0).map((_, j) => {
            return new Array(n+1).fill(0);
        });
    });

    const get1s = (ele) => {
        const arr = ele.split('');
        const ones = arr.reduce((acc, a) => acc + parseInt(a));
        return ones;
    }

    const get0s = (ele) => {
        const ones = get1s(ele);
        const zeros = ele.length - ones;
        return zeros;
    }

    for(let i=1; i<=len; ++i) {
        const ele = strs[i-1];
        const zeros = get0s(ele);
        const ones = get1s(ele);

        for(let j=0; j<=m; ++j) {
            for(let k=0; k<=n; ++k) {
                if(j-zeros >=0 && k-ones >= 0) {
                    dp[i][j][k] = 1 + dp[i-1][j-zeros][k-ones];
                } else {
                    dp[i][j][k] = dp[i-1][j][k];
                }
            }
        }
    }

    return dp[len][m][n];        
};

样例输入输出

  • 输入数组:["10","0001","111001","1","0"]
  • m = 5,n = 3
  • 预期输出:4

问题排查与修复

你的代码核心问题在于动态规划的状态转移逻辑错误:当当前字符串可以被选取(j-zeros >=0 && k-ones >=0)时,你直接赋值为1 + dp[i-1][j-zeros][k-ones],但忽略了「不选取当前字符串」的情况可能得到更大的值。正确的转移应该是在「选」和「不选」中取最大值。

同时补充一个细节:get1s函数里的reduce需要添加初始值0,避免空字符串场景下返回undefined,让代码更健壮。

完整修复后的代码

/**
 * @param {string[]} strs
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var findMaxForm = function(strs, m, n) {
    const len = strs.length;
    const dp = new Array(len+1).fill(0).map((_, i) => {
        return new Array(m+1).fill(0).map((_, j) => {
            return new Array(n+1).fill(0);
        });
    });

    const get1s = (ele) => {
        const arr = ele.split('');
        const ones = arr.reduce((acc, a) => acc + parseInt(a), 0);
        return ones;
    }

    const get0s = (ele) => {
        const ones = get1s(ele);
        const zeros = ele.length - ones;
        return zeros;
    }

    for(let i=1; i<=len; ++i) {
        const ele = strs[i-1];
        const zeros = get0s(ele);
        const ones = get1s(ele);

        for(let j=0; j<=m; ++j) {
            for(let k=0; k<=n; ++k) {
                if(j-zeros >=0 && k-ones >= 0) {
                    dp[i][j][k] = Math.max(dp[i-1][j][k], 1 + dp[i-1][j-zeros][k-ones]);
                } else {
                    dp[i][j][k] = dp[i-1][j][k];
                }
            }
        }
    }

    return dp[len][m][n];        
};

内容的提问来源于stack exchange,提问作者kenpeter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:07:39