leetcode刷题笔记六十二与六十三 不同路径与不同路径II

leetcode刷题笔记六十二与六十三 不同路径与不同路径II


第六十二题 不同路径

源地址:62. 不同路径

问题描述:

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

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

问总共有多少条不同的路径?

示例 1:

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

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右
    示例 2:

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

提示:

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

代码补充:

/**
本题是较为简单的动态规划题目
使用等大二维数组记录到达每个位置的方法计数
初始状态:dp(0)(0) = 1
初始化: 
由于机器人只能沿下方向,右方向移动,故首行首列初始化均为1
dp(i)(0) = 1 dp(0)(j) = 1
动态方程(受左侧及上侧方法数影响):
dp(i)(j) = dp(i-1)(j) + dp(i)(j-1)
*/
object Solution {
    def uniquePaths(m: Int, n: Int): Int = {
        val dp = Array.ofDim[Int](m, n)
        for {
            i <- 0 until m
            j <- 0 until n
        } 
        dp(i)(j) = (i,j) match {
            case (0,0) => 1
            case (0,_) => 1
            case (_,0) => 1
            case (_,_) => dp(i-1)(j) + dp(i)(j-1)
        }
         return dp(m - 1)(n - 1)
    }
}

第六十三题 不同路径II

源地址:63. 不同路径 II

问题描述:

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

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

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

说明:m 和 n 的值均不超过 100。

示例 1:

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

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

代码补充:

/**
与62题一致,使用动态规划方法
不同的两点包括:
1.对障碍点设置其对应位置方法数为0
2.使用滚动数组思想,节省空间

滚动数组是DP中一种编程方法,将数组滚动起来,每次使用固定的几个存储空间,达到压缩空间作用。以时间换空间的一种方法。
就本题而言,使用length长度数组逐行扫描,更新数组位置基本上一次扫描的结果与其左侧计算结果。
*/
import util.control.Breaks._
object Solution {
    def uniquePathsWithObstacles(obstacleGrid: Array[Array[Int]]): Int = {
        val high = obstacleGrid.length
        val length = obstacleGrid(0).length
        val dp = Array.fill(length)(0)
        
        //防止第一个点即为障碍
        if(obstacleGrid(0)(0) == 1) dp(0) = 0
        else dp(0) = 1    

        for(i <- 0 to high-1){
            for(j <- 0 to length-1){
                breakable{
                    if(obstacleGrid(i)(j) == 1){
                        dp(j) = 0
                        break
                    }
                    if(j>=1 && obstacleGrid(i)(j-1) == 0){
                        dp(j) += dp(j-1)
                    }
                }
            }
        }

        return dp(length-1)

    }
}
posted @ 2020-07-14 17:48  ganshuoos  阅读(141)  评论(0编辑  收藏  举报