LeetCode 62. 不同路径
题目链接:62. 不同路径 - 力扣(LeetCode)
每道题都要考虑dp五步:
便于理解,处于菜鸟阶段,乖乖地使用二维数组来实现
1)确定dp数组下标与值的关系:当前位置存在的可能路径
2)确定递推公式:要么上边来的,要么左边来的
3)确定初始值:dp[0][0] == 1,第一行第一列的都要初始为1
4)确定遍历的数:第二行、第二列开始
5)带入验证一下
代码:
#python
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[0 for _ in range(n)] for _ in range(m)]
dp[0][0] = 1 //注意初始化为1
for i in range(m):
dp[i][0] = 1 //初始化第一列
for i in range(n):
dp[0][i] = 1 //初始化第一行
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] //递推公式
return dp[m - 1][n - 1]
/java
class Solution {
public int uniquePaths(int m, int n) {
int[][] mat = new int[m][n];
for(int i = 0; i < m; i++){
mat[i][0] = 1;
}
for(int i = 0; i < n; i++){
mat[0][i] = 1;
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
mat[i][j] = mat[i - 1][j] + mat[i][j - 1];
}
}
return mat[m - 1][n - 1];
}
}
LeetCode 63. 不同路径 II
题目链接:63. 不同路径 II - 力扣(LeetCode)
每道题都要考虑dp五步:
该题在上一道题的基础上,增加了障碍物,用原始数组的1来表示,所以我们要增加这样的考虑,被堵住了就不能再用了
1)确定dp数组下标与值的关系:当前位置存在的可能路径
2)确定递推公式:要么上边来的,要么左边来的
3)确定初始值:dp[0][0] == 1,第一行第一列的都要初始为1,注意判断一下初始位置与结束位置是否存在障碍物,存在则直接返回0(即是不可到达)
4)确定遍历的数:第二行、第二列开始
5)带入验证一下
代码:
#python
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m, n =len(obstacleGrid), len(obstacleGrid[0]) //简化一下,不然太复杂
if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1: //判断端点情况
return 0
dp = [[0 for _ in range(n)] for _ in range(m)] //初始化dp数组
dp[0][0] = 1 //赋值为1
for i in range(1, m):
if obstacleGrid[i][0]: //如果遇到障碍物了,跳出当前循环了,走不了了
break
else:
dp[i][0] = dp[i - 1][0]
for i in range(1, n): //同上的思路
if obstacleGrid[0][i]:
break
else:
dp[0][i] = dp[0][i - 1]
for i in range(1, m):
for j in range(1, n):
if obstacleGrid[i][j]: //有障碍物就算了,不赋值了
continue
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] //否则我们赋值,注意就算上方或者左方有障碍物也没关系的,因为其dp值为0,不影响
return dp[m - 1][n - 1] //返回最后一个位置,得到这过程中所有可能的路径
/java
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length, n = obstacleGrid[0].length;
int[][] mat = new int[m][n];
// 初始化第一列,如果有障碍物则后续都为0
for (int i = 0; i < m && obstacleGrid[i][0] != 1; i++) {
mat[i][0] = 1;
}
// 初始化第一行,如果有障碍物则后续都为0
for (int j = 0; j < n && obstacleGrid[0][j] != 1; j++) {
mat[0][j] = 1;
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(obstacleGrid[i][j] == 1){
mat[i][j] = 0;
}
else{
mat[i][j] = mat[i - 1][j] + mat[i][j - 1];
}
}
}
return mat[m - 1][n - 1];
}
}