• LeetCode_#62#63_不同路径


    LeetCode_#62#63_不同路径

    Contents

    LeetCode_#62_不同路径

    题目

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

    例如,上图是一个7 x 3 的网格。有多少可能的路径?
    示例 1:

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

    示例 2:

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

    提示:
    1 <= m, n <= 100
    题目数据保证答案小于等于 2 * 10 ^ 9

    思路分析

    动态规划。
    状态定义:
    dp[i][j]表示从坐标[0,0][i,j]的路径总数。
    初始状态:

    dp[0][0] = 1

    状态转移方程:

    dp[i][j] = dp[i-1][j] + dp[i][j - 1] (i,j≠0)
    dp[i][j] = dp[i-1][j] (i ≠ 0,j = 0)
    dp[i][j] = dp[i][j - 1] (i = 0,j ≠0)

    返回值:

    dp[rows - 1][cols - 1]

    解答

    编码时需要注意,函数参数m,n分别代表列数和行数,不要弄反,可以重新用rows,cols变量表示,更加清晰。

    class Solution {
        public int uniquePaths(int m, int n) {
            int rows = n;
            int cols = m;
            int[][] dp = new int[rows][cols];
            //初始化为1
            dp[0][0] = 1;
            for(int i = 0;i <= rows - 1;i++){
                for(int j = 0; j<= cols - 1;j++){
                    if(i == 0 && j == 0) continue;
                    if(i == 0 && j != 0) dp[i][j] = dp[i][j - 1];
                    else if(i != 0 && j == 0) dp[i][j] = dp[i - 1][j];
                    else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
            return dp[rows - 1][cols - 1];
        }
    }

    LeetCode_#63_不同路径II

    题目

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
    网格中的障碍物和空位置分别用 1 和 0 来表示。
    说明:m 和 n 的值均不超过 100。
    示例 1:

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

    思路分析

    #62题相比,仅仅是增加了一个可能会有障碍的设定。处理也很简单,就是在dp数组中,将障碍所在位置设置为0。

    解答

    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int rows = obstacleGrid.length;
            int cols = obstacleGrid[0].length;
            //障碍如果在起点或者终点,直接返回0
            if(obstacleGrid[0][0] == 1 || obstacleGrid[rows - 1][cols - 1] == 1)
                return 0;
            int[][] dp = new int[rows][cols];
            dp[0][0] = 1;
            for(int i = 0;i <= rows - 1;i++){
                for(int j = 0;j <= cols - 1;j++){
                    //dp数组中,将有障碍的位置设置为0
                    if(obstacleGrid[i][j] == 1){
                        dp[i][j] = 0;
                    }else if(i == 0 && j != 0){
                        dp[i][j] = dp[i][j - 1];
                    }else if(i != 0 && j == 0){
                        dp[i][j] = dp[i - 1][j];
                    }else if(i != 0 && j != 0){
                        dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                    }
                }
            }
            return dp[rows - 1][cols - 1];
        }
    }
  • 相关阅读:
    docker (2) 私有仓库的建立
    golang (5) http 请求分析
    java (1)
    golang (5) ---工程管理
    Mac使用一些经验
    数组的遍历
    进制
    数组的初始化
    数组基本概念
    博客开始更新第一天
  • 原文地址:https://www.cnblogs.com/Howfars/p/13330781.html
Copyright © 2020-2023  润新知