【力扣一刷】代码随想录day39(动态规划part2:62.不同路径、63. 不同路径 II )

【62.不同路径】中等题

思路:

1、前提:只能向右或向下移动一步,当前格子只能由左边(向右移)或上边(向下移)到达

2、递推关系:到达当前格子的路径数 = 到达左边格子的路径数 + 到达上边格子的路径数

方法一  只初始化start位置

思路:

1、设置start位置的初始值为1

2、计算到达当前格子的路径数:当前格子只能由左边(向右移)或上边(向下移)到达

  • 第一行只加左边
  • 第一列只加上边
  • 其余情况,左边+上边
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] matric = new int[m][n];

        for (int i = 0; i < m; i++){
            for (int j = 0; j < n; j++){
                if (i == 0 && j == 0) {
                    matric[i][j] = 1; // 注意:start位置的值为1
                    continue;
                }

                // 当前格子只能由左边(向右移)或上边(向下移)到达
                if (i == 0) matric[i][j] = matric[i][j-1]; // 第一行只加左边
                else if (j == 0) matric[i][j] = matric[i-1][j]; // 第一列只加上边
                else matric[i][j] = matric[i][j-1] + matric[i-1][j]; // 其余情况,左边+上边
            }
        }
        return matric[m-1][n-1];
    }
}
  • 时间复杂度:O(m×n)
  • 空间复杂度:O(m×n)

方法二  初始化第一行和第一列

思路:

1、将第一行的格子和第一列的格子都初始化为1

2、其余格子都存在左边的格子和上边的格子,直接相加即可

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] matric = new int[m][n];

        for (int j = 0; j < n; j++) matric[0][j] = 1;  // 将第一行的格子都初始化为1
        for (int i = 0; i < m; i++) matric[i][0] = 1;  // 将第一列的格子都初始化为1

        // 其余格子都存在左边的格子和上边的格子,直接相加即可
        for (int i = 1; i < m; i++){
            for (int j = 1; j < n; j++){
                matric[i][j] = matric[i][j-1] + matric[i-1][j];
            }
        }
        return matric[m-1][n-1];
    }
}
  • 时间复杂度:O(m×n)
  • 空间复杂度:O(m×n)


【63. 不同路径 II】中等题

思路:

1、如果开始位置或结束位置有障碍物,则肯定无法出发或到达,直接返回0

2、初始化第一行和第一列

  • 如果第一行某个格子出现障碍物,则当前格子以及右边的所有格子都无法到达(直接使用初始化的默认值0即可);如果当前格子没有障碍物,则直接设为1。
  • 如果第一列某个格子出现障碍物,则当前格子以及下边的所有格子都无法到达(直接使用初始化的默认值0即可);如果当前格子没有障碍物,则直接设为1。

3、遍历剩余格子

  • 如果当前格子有障碍物,则无法到达,设为0
  • 如果当前格子有障碍物,则到达当前格子的路径数 = 到达左边格子的路径数 + 到达上边格子的路径数
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int rows = obstacleGrid.length;
        int columns = obstacleGrid[0].length;
        int[][] matric = new int[rows][columns];

        // 如果开始位置或结束位置有障碍物,则肯定无法出发或到达,直接返回0
        if (obstacleGrid[0][0] == 1 || obstacleGrid[rows-1][columns-1] == 1) return 0;

        for (int j = 0; j < columns; j++){
            // 如果第一行某个格子出现障碍物,则当前格子以及右边的所有格子都无法到达(直接使用初始化的默认值0即可)
            if (obstacleGrid[0][j] == 1) break; 
            // 如果当前格子没有障碍物
            else{
                matric[0][j] = 1;
            }
        }

        for (int i = 0; i < rows; i++){
            // 如果第一列某个格子出现障碍物,则当前格子以及下边的所有格子都无法到达(直接使用初始化的默认值0即可)
            if (obstacleGrid[i][0] == 1) break; 
            // 如果当前格子没有障碍物
            else{
                matric[i][0] = 1;
            }
        }

        for (int i = 1; i < rows; i++){
            for (int j = 1; j < columns; j++){
                if (obstacleGrid[i][j] == 1) matric[i][j] = 0;
                else {
                    matric[i][j] = matric[i-1][j] + matric[i][j-1];
                }
            }
        }
        return matric[rows-1][columns-1];
    }
}
  • 时间复杂度:O(m×n)
  • 空间复杂度:O(m×n)

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值