LeetCode 62 不同路径
思路
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,一共有多少种不同的路径?
在网格[i,j]处,要么从[i-1,j]向下移动而来,要么从[i, j-1]移动而来。所以我们应该从上到下,从左到右推导。
- 确定dp数组(dp table)以及下标的含义:
dp[i][j]指走到i行j列有几种路径 - 确定递推公式:
dp[i][j] = dp[i-1][j]+dp[i][j-1] - dp数组如何初始化:
dp[0][0]=1,第一行和第一列也都初始化为1 - 确定遍历顺序:i做外循环,j做内循环,递增遍历
- 举例推导dp数组:3✖️7网格,dp[0]为1,1,1,1,1,1,1;dp[1]为1,2,3,4,5,6,7;dp[2]为1,3,6,10,15,21,28
解法
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
return dp[m-1][n-1];
}
}
LeetCode 63 不同路径 II
思路
本题和上一题知识多了一种障碍物信息,依然可以用动态规划法来分析
在网格[i,j]处,要么从[i-1,j]向下移动而来,要么从[i, j-1]移动而来,且[i-1,j]和[i, j-1]没有障碍。如果其中任一地块有障碍,则只能从没有障碍的地块移动而来。
- 确定dp数组(dp table)以及下标的含义:
dp[i][j]指走到i行j列有几种路径 - 确定递推公式:
dp[i][j] = dp[i-1][j]+dp[i][j-1] - dp数组如何初始化:需要初始化第一行和第一列,在第一行中,没有遇到第一个障碍之前,都初始化为1,遇到后剩下的都为0。第一列同理
- 确定遍历顺序:i做外循环,j做内循环,递增遍历。遇到障碍的部分就跳过
- 举例推导dp数组:
解法
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
if (obstacleGrid[i][0] == 0) {
dp[i][0] = 1;
}
else {
break;
}
}
for (int i = 0; i < n; i++) {
if (obstacleGrid[0][i] == 0) {
dp[0][i] = 1;
}
else {
break;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 0) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
今日收获总结
今日学习2小时,不同路径中如何初始化dp数组还是很讲究的