leetcode刷题笔记六十二与六十三 不同路径与不同路径II
leetcode刷题笔记六十二与六十三 不同路径与不同路径II
第六十二题 不同路径
源地址:62. 不同路径
问题描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 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 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
代码补充:
/**
与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)
}
}