✅✅代码随想录算法训练营Day39 || 62. 不同路径 63. 不同路径 II

182 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情🚀🚀

前言

今天的题目难度属于中等偏下的,还是比较有趣~

62. 不同路径 - 力扣(LeetCode)

image.png

代码实现

var uniquePaths = function(m, n) {
     const dp = Array(m).fill().map(item => Array(n).fill(0))
    
    for (let i = 0; i < m; ++i) {
        dp[i][0] = 1
    }
    
    for (let i = 0; i < n; ++i) {
        dp[0][i] = 1
    }
    
    for (let i = 1; i < m; ++i) {
        for (let j = 1; j < n; ++j) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        }
    }
    return dp[m - 1][n - 1]
};

用昨天修言老师的思路,看到这种求路径总数,不要求具体路径,我们都可以采用动态规划的思想。再先用一种自顶向下的思想,站在终点倒退,找到状态转移方程。

收获

  • 创建二维数组

    const dp = Array(m).fill().map(item =>Array(n).fill(0))

  • 为开始的边界设置初始值

    for (let i = 0; i < m; ++i) {
        dp[i][0] = 1
    }
    
    for (let i = 0; i < n; ++i) {
        dp[0][i] = 1
    }

因为这种直来直去的走法只有一条路~

自己写的时候也是这里没有想通

63. 不同路径 II - 力扣(LeetCode)

image.png

代码实现

var uniquePathsWithObstacles = function(obstacleGrid) {
    let m = obstacleGrid.length;
    let n = obstacleGrid[0].length
    let dp = Array(m).fill(0).map(item => Array(n).fill(0))
    for(let i = 0;i < m && obstacleGrid[i][0] == 0;i++){
        dp[i][0] = 1;
    }
    for(let i = 0;i < n && obstacleGrid[0][i] == 0;i++){
        dp[0][i] = 1;
    }
    for(let i = 1;i < m;i++)
        for(let j = 1;j < n;j++){
            if(obstacleGrid[i][j] == 0)
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
        }
    return dp[m-1][n-1]
};

难点

  • 二维数组
    let m = obstacleGrid.length;
    let n = obstacleGrid[0].length
    let dp = Array(m).fill(0).map(item => Array(n).fill(0))

这样获取二维数组的长度和创建二维数组的方式还是不太熟练

  • 障碍物的存在

把障碍物的存在想复杂了一点,它在这里只是影响了两个地方,一个就是初始化,一个就是状态转移方程。就是多加了一个条件而已了~