LeetCode:62.不同路径
1.思路
想象成矩阵填格子,两个关键点,初始化和递推公式。
初始化除点(0,0)第一行第一列均为1,递推公式推导dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
2.代码实现
1class Solution {
2 public int uniquePaths(int m, int n) {
3 // 二维数组
4 int[][] dp = new int[m][n];
5
6 // dp[m][n]:到达m,n位置,有dp[m][n]种路径
7 // 初始化
8 for (int i = 0; i < m; i++) {
9 dp[i][0] = 1;
10 }
11 for (int i = 0; i < n; i++) {
12 dp[0][i] = 1;
13 }
14 for (int i = 1; i < m; i++) {
15 for (int j = 1; j < n; j++) {
16 dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
17 }
18 }
19 return dp[m - 1][n - 1];
20 }
21}
22
3.复杂度分析
时间复杂度:O(m * n).
空间复杂度:O(m * n).
LeetCode:63. 不同路径 II
1.思路
确定dp[][]数组,
条件排除,各种情况的考虑很关键,首尾节点和首行首列会影响初始化,当前节点影响dp[i][j]的值,
2.代码实现
1class Solution {
2 public int uniquePathsWithObstacles(int[][] obstacleGrid) {
3 // 求出总路径数 - 障碍位置路径数?
4
5 int m = obstacleGrid.length; // 获取行数
6 int n = obstacleGrid[0].length; // 获取列数
7 // dp[m][n] 表示节点(m,n)处潜在路径数
8 int[][] dp = new int[m][n];
9 // 当起始节点和终止节点均有障碍时,无结果,直接返回0
10 if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
11 return 0;
12 }
13 // 每行的首位数字初始化(也即首列初始化),遇到障碍设置为0
14 for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
15 dp[i][0] = 1;
16 }
17 // 每列的首位数字初始化(也即首行初始化),遇到障碍设置为0
18 for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
19 dp[0][j] = 1;
20 }
21 // 遍历输出dp[][]数组值
22 for (int i = 1; i < m; i++) {
23 for (int j = 1; j < n; j++) [
24 if (obstacleGrid[i][j] == 0) { // 当前节点没有障碍时,正常执行
25 dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
26 } else {
27 dp[i][j] = 0; // 有障碍时直接赋值为0
28 }
29 ]
30 }
31 // 数组下标从0 开始,m - 1, n - 1也就代表(m,n)位置
32 return dp[m - 1][n - 1];
33
34 }
35}
36
3.复杂度分析
时间复杂度:O(m * n).
空间复杂度:O(m * n).