• 代码随想录day39 || 动态规划 || 不同路径


    62.不同路径

    ● 力扣题目链接
    ● 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
    ● 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
    ● 问总共有多少条不同的路径?

    思路

    ● dp数组初始化,第一行第一列是1,然后某个位置只能从上面或者左面过来
    ● 时间复杂度:O(m × n)
    ● 空间复杂度:O(m × n)

    代码

    class Solution {
        public int uniquePaths(int m, int n) {
            int[][] dp = new int[m][n];
            for (int i = 0; i < n; i++) {
                dp[0][i] = 1;
            }
            for (int i = 0; i < m; i++) {
                dp[i][0] = 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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    63. 不同路径 II

    ● 力扣题目链接
    ● 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
    ● 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
    ● 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    思路

    ● 在初始化和遍历的时候加上是否是障碍物的判断

    代码

    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int m = obstacleGrid.length;
            int n = obstacleGrid[0].length;
            int[][] dp = new int[m][n];
            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++) {
                    dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
                }
            }
            return dp[m - 1][n - 1];
        }
    }
    // 空间优化
    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int m = obstacleGrid.length;
            int n = obstacleGrid[0].length;
            int[] dp = new int[n];
            for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++) {
                dp[i] = 1;
            }
            for (int i = 1; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (obstacleGrid[i][j] == 1) dp[j] = 0;
                    else if (j != 0) dp[j] += dp[j - 1];
                }
            }
            return dp[n - 1];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    Python绘图系统22:实现系统菜单
    杰理之立体声输入【篇】
    第5章 uin-app本地主机数据跨域(Cors)数据交互实现
    Android之startActivityForResult过时升级替换方法
    今年的数据安全风险点是什么?看数据
    竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像
    【Go语言】Go语言中的切片
    NVIDIA:应将USD作为3D互联网的HTML标准语言
    如何在 macOS 上安装 Docker Desktop
    Vue中的 v-cloak 指令
  • 原文地址:https://blog.csdn.net/peach2580/article/details/132941959