代码随想录算法训练营第29天|62.不同路径、63. 不同路径 II

LeetCode62

2025-03-01 15:56:00 星期六

题目描述:力扣62
文档讲解:代码随想录(programmercarl)62.不同路径
视频讲解:《代码随想录》算法视频公开课:动态规划中如何初始化很重要!| LeetCode:62.不同路径

代码随想录视频内容简记

这道题需要定义一个二维dp数组

梳理

  1. 确定dp[i][j]数组的含义,表示从[0][0]到[i][j]一共有多少种不同的走法

  2. 确定递归公式,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

  3. 初始化dp数组,dp数组的初始化需要将最上一行以及最左一列进行初始化。因为本题机器人只能从上往下走,从左往右走,所以最上边和最左边是必须要进行初始化的

    如果是最左边一列和最上边一行,他的路径走法是只有一种的,只能沿着一条路径走

  4. 确定遍历顺序,那么根据题意,就是从上往下遍历,从左往右遍历

  5. 打印dp数组

LeetCode测试

注意,这个题在写for循环的时候有一个小细节,初始化是从1开始的,而不是0

点击查看代码
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i = 0; i < m; i++) dp[i][0] = 1;
        for (int i = 0; i < n; i++) dp[0][i] = 1;
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
    }
};

LeetCode63

题目描述:力扣63
文档讲解:代码随想录(programmercarl)63. 不同路径 II
视频讲解:《代码随想录》算法视频公开课:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II

代码随想录视频内容简记

这道题和62的区别就在于设置了障碍物,感觉确实没思路,听了一下视频讲解

要点

  1. 因为设置了障碍物,所以递推公式会发生变化,就是如果这个方格中是障碍物,也就是1,那么就不进行递推

  2. 其次就是dp数组初始化,一旦最左列和最上行出现了障碍物,那么这个障碍物后面的格子必然不发到达,所以只初始化到第一个障碍物出现

  3. 如果第一个格子就是障碍物,或者最后一个格子是障碍物,那么直接return 0即可

梳理

  1. 定义dp[i][j]数组,这里仍然表示的是到达[i][j]有多少种路径

  2. 确定递推公式,这里加上一个if判断即可

  3. 初始化dp数组,for (int i = 0; i < m && obstacle[i][0] == 0; i++)

  4. 确定遍历顺序,和62一样

  5. 打印dp数组

LeetCode测试

整体和62一致,处理好细节即可

点击查看代码
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        if (obstacleGrid[0][0] == 1) return 0;
        if (obstacleGrid[obstacleGrid.size() - 1][obstacleGrid[0].size() - 1] == 1) return 0; 
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int> (n,0));
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
        for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++) dp[0][i] = 1;
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] != 1) dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
    }
};
posted on   bnbncch  阅读(432)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示