javaScript 两个for循环修改二维列表数值直接一列修改

2020/7/7

抱歉各位,可能是我的表达不清,我不是对于这道题有疑惑,是在写这道题的过程中我发现我的结果有误,向各位请教问题出在哪里了。

重申一下我的问题:我的问题是为什么我对于二维列表中的一个元素进行值的修改,却是一整个列的元素值都被修改了呢?

问题出在了--->我在初始化的过程中使用同一个一维列表对于二维列表进行赋值,导致了多个行其实指向了同一个地址,因此出现这样的问题,感谢各位的帮助!



初学javascript,使用leetcode写题来加深掌握,见leetcode.T63。方法很明确,动态规划,但是在初始化上使用了多加一行一列来保存状态,但是在循环的过程中出现了问题,一次循环应该改变列表中一个元素的值却整个列被改变,不知道原因。

// Algorithm, 最基本的循环
    for(i=1;i<=r;i++){
        for(j=1;j<=c;j++){
            console.log("add result",dp[i-1][j] + dp[i][j-1])
            dp[i][j]  = dp[i-1][j] + dp[i][j-1];
            console.log(i,j,dp);
        }
    }


将结果进行了打印

// result
add result -2
1 1 [
  [ -1, -1, -1, -1 ],
  [ -1, -2, 0, 0 ],
  [ -1, -2, 0, 0 ],
  [ -1, -2, 0, 0 ]
]
add result -3
1 2 [
  [ -1, -1, -1, -1 ],
  [ -1, -2, -3, 0 ],
  [ -1, -2, -3, 0 ],
  [ -1, -2, -3, 0 ]
]


不知道是不是自己初始化的问题,弄了一下午还是错的。希望有人能帮帮忙

// 源代码
/**
 * @param {number[][]} obstacleGrid
 * @return {number}
 */
var uniquePathsWithObstacles = function(obstacleGrid) {
    // Initilization
    const r = obstacleGrid.length;
    const c = obstacleGrid[0].length;
    const tt = new Array();
    for(i=0;i<=c;i++)
    {
        tt[i] = -1;
    }
    const t = new Array();
    for(i=0;i<=c;i++)
    {
        t[i] = 0;
    }
    const dp = new Array();
    dp[0] = tt;
    for(i=1;i<=r;i++)
    {
        dp[i] = t;
        dp[i][0] = -1;        
    }

    // Algorithm 
    for(i=1;i<=r;i++){
        for(j=1;j<=c;j++){
            console.log("add result",dp[i-1][j] + dp[i][j-1])
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
            console.log(i,j,dp);
        }
    }
    // console.log(dp);
    return dp[r][c];

};

没看懂要做什么。。。说一下你想实现什么吧。。

参考下 https://blog.csdn.net/qq_43320728/article/details/104951078
js的话,需要首先把v初始化为col长度,然后每一行初始化为obstacleGrid的长度

M* N 二维数组, 转成 迭代 M*N次

for(var i=0;i<M*N;i++){
    row = i/M;
    column = i%N
    A[row][column] ='修改值'
}
let arr = []
function changeColumn(column, value){
    for (let i = 0, len = arr.length; i < len; i++) {
        let arrj = arr[i]
        for (let j = 0, lenj = arrj.length; j < lenj; j++) {
            if(j == column){
                arrj[j] = value
                break
            }
        }

    }
}

function uniquePathsWithObstacles(obstacleGrid) {
        // Initilization
        const r = obstacleGrid.length;
        const c = obstacleGrid[0].length;
        for (let i = 0; i < r; i++) {
          for (let j = 0; j < c; j++) {
            obstacleGrid[i][j] = -1;
          }
        }

        for (let i = 1; i < obstacleGrid.length; i++) {
          for (let j = 1; j < obstacleGrid[i].length; j++) {
            obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
          }
        }
        console.log(obstacleGrid)
        return obstacleGrid[r - 1][c - 1];    
    };