文章目录
- 前言
- 一、不同路径(力扣62)
- 二、不同路径||(力扣63)
- 三、最小路径和(力扣64)
前言
1、不同路径
2、不同路径||
3、最小路径和
一、不同路径(力扣62)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
思路:
五部曲:
1、dp数组:
dp[i][j]:到达第i行第j列的路径有dp[i][j]条
2、初始化 (易错)
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;
3、递推公式
dp[i][j] = dp[i-1][j]+dp[i][j-1];
只能从这两个方向过来
4、遍历顺序
从前向后
5、打印检查
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 j = 0; j < n; j++) dp[0][j] = 1;
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
二、不同路径||(力扣63)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
思路:
五部曲:
1、dp数组:
dp[i][j]:到达第i行第j列的路径有dp[i][j]条
2、初始化
for(int i = 0;i < m && obstacleGrid[i][0]!=1;i++) dp[i][0]=1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;
3、递推公式
dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
4、遍历顺序
从前向后
5、打印检查
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
//如果在起点或终点出现了障碍,直接返回0
if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
return 0;
}
for(int i = 0;i < m && obstacleGrid[i][0]!=1;i++)
dp[i][0]=1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
dp[0][j] = 1;
}
//遍历
for(int x=1;x<m;x++){
for(int y=1;y<n;y++){
if(obstacleGrid[x][y]!=1){
dp[x][y]=dp[x-1][y]+dp[x][y-1];
}else
dp[x][y]=0;
}
}
return dp[m-1][n-1];
}
}
三、最小路径和(力扣64)
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
思路:
五部曲:
1、dp数组:
我们完全不需要建立dp矩阵浪费额外空间,直接遍历 grid[i][j] 修改即可
2、初始化
for(int i=1;i<m;i++) grid[i][0] += grid[i-1][0];
for(int j=1;j<n;j++) grid[0][j] += grid[0][j-1];
3、递推公式
grid[i][j] +=Math.min(grid[i-1][j],grid[i][j-1])
4、遍历顺序
从前向后
5、打印检查
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
//初始化
for(int i=1;i<m;i++){
grid[i][0] += grid[i-1][0];
}
for(int j=1;j<n;j++){
grid[0][j] += grid[0][j-1];
}
//遍历
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
grid[i][j] += Math.min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
}