Leetcode 62,63- 不同路径
1. 题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
1 | 输入: m = 3, n = 2 |
2. 思路
一看就是动态规划,列举一下,具体的前后关系就有了:
也就是每个位置的路径数等于它上面和左边位置路径数之和。
有个坑点就是,我最开始以为假如m=1,n=1时算0种情况,其实算1种。
3. 代码
1 | // 动态规划 |
4.同类题
- LeetCode 63- 不同路径②
就是加了一个限制,即棋盘上可能有障碍物。
其实思路和之前类似,只不过障碍物处的可能路径数为0。注意一下边界初始化的特殊情况就行啦,同样也是上面加左边位置可能的路径数之和。代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39// 动态规划 63题
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] res = new int[m][n];
// 如果第一个棋子就是障碍物,怎么都走不动,返回0
if (obstacleGrid[0][0] == 1) return 0;
// 初始值
res[0][0] = 1;
// 在第一行和第一列,
for (int r = 1; r < m; r++) {
// 如果当前有障碍,置0
if (obstacleGrid[r][0] == 1)
res[r][0] = 0;
// 否则置为它的前一个位置的路径数
else
res[r][0] = res[r - 1][0];
}
for (int c = 1; c < n; c++) {
if (obstacleGrid[0][c] == 1)
res[0][c] = 0;
else
res[0][c] = res[0][c - 1];
}
// 每个值等于它的上面的值和左边的值之和
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1)
res[i][j] = 0;
else
res[i][j] = res[i - 1][j] + res[i][j - 1];
}
}
return res[m - 1][n - 1];
}