本文介绍: JAVA代码编写一个机器人位于一个m x n网格的左上角 (起始点在下图标记为 “Start” )。机器人每次只能向下或者向右移动一步机器人试图达到网格的右下角(在下图标记为 “Finish” )。问总共有多少不同路径?2 * 109。

JAVA代码编写

62.不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图标记为 “Start” )。

机器人每次只能向下或者向右移动一步机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少不同路径

示例 1:

img

输入m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示

教程https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html

方法一:动态规划

思路

步骤

  1. 定义$dp[i][j]

    数组表示从(

    0

    0

    )出发,到

    (

    i

    ,

    j

    )

    有条

    数组表示从(0 ,0)出发,到(i, j) 有条

    数组:表示从(00)出发,到(i,j)有条dp[i][j]$不同路径

  2. 递推公式dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]

  3. dp数组初始化dp[0] [0] =0,dp [0] [1]=1,dp[1] [0] =1

  4. 确定遍历顺序:根据递推公式,从前往后, 从上往下

  5. 举例推导dp数组,以m = 3, n = 7举例

在这里插入图片描述

dp[0] [0] = 1,不是0

复杂度分析

class Solution {
    public int uniquePaths(int m, int n) {
		int[][] dp = new int[m][n];
        // 第一行全置为1
        for(int i = 0; i < n; i++){
            dp[0][i] = 1;
        }
        // 第一列全置为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];
    }
}

63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少不同路径

网格中的障碍物和空位置分别用 10表示

示例 1:

img

输入obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

img

输入obstacleGrid = [[0,1],[0,0]]
输出:1

提示

教程https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html

方法一:动态规划1

思路

  1. 步骤
    1. 定义$dp[i][j]

      数组:表示从(

      0

      0

      )出发,到

      (

      i

      ,

      j

      )

      有条

      数组:表示从(0 ,0)出发,到(i, j) 有条

      数组:表示从(00)出发,到(i,j)有条dp[i][j]$不同路径

    2. 递推公式:dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]

    3. dp数组初始化:dp[0] [0] =0,dp [0] [1]=1,dp[1] [0] =1,障碍物位置dp [1] [1] = 0

    4. 确定遍历顺序:根据递推公式,从前往后, 从上往下

    5. 举例推导dp数组,以obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]举例

在这里插入图片描述

复杂度分析

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length; // 行数
        int n = obstacleGrid[0].length; // 列数
        int[][] dp = new int[m][n];

        //如果在起点或终点出现了障碍,直接返回0
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
            return 0;
        }

        for (int i = 0; i < m &amp;&amp; obstacleGrid[i][0] == 0; i++) {//在这加条件
            dp[i][0] = 1;
        }
        for (int j = 0; j < n &amp;&amp; obstacleGrid[0][j] == 0; j++) {
            dp[0][j] = 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];
    }
}

原文地址:https://blog.csdn.net/Catherinemin/article/details/134755621

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_29708.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注