动态规划
62.不同路径
解题思路:
动态规划: 达到每个位置的不同路径由其上方来的+左方来的
代码:
class Solution {
public int uniquePaths(int m, int n) {
// 动态规划 --- (0,0) -> (m, n) 的不同路径
int[][] dp = new int[m][n];
// 初始化 第一行
for(int col = 0; col < n; col++) {
dp[0][col] = 1;
}
// 初始化第一列
for(int row = 0; row < m; row++) {
dp[row][0] = 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.不同路径II
解题思路:
动态规划:
- 和不同路径I相比, 遇到有障碍物的地方, 则dp数组标记不可达 路径方案自然为0
- 注意初始化时候, 遇到障碍物了, 则障碍物后面的地方不可达
代码:
class Solution {
// 路径上有障碍物的不同路径
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length, n = obstacleGrid[0].length;
// 起点或者终点就是障碍物, 则不可达
if(obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1) return 0;
// 如果当前位置不可达, 则将到达当前位置的不同路径数量置为0
int[][] dp = new int[m][n];
dp[0][0] = 1;
// 初始化
boolean flag = true;
for(int col=1; col < n; col++){
if(obstacleGrid[0][col] == 0 && flag){
dp[0][col] = 1;
}else{
dp[0][col] = 0;
flag = false;
}
}
flag = true;
for(int row=1; row < m; row++){
if(obstacleGrid[row][0] == 0 && flag){
dp[row][0] = 1;
}else{
dp[row][0] = 0;
flag = false;
}
}
for(int i=1; i<m; i++){
for(int j=1; j<n; j++) {
dp[i][j] = obstacleGrid[i][j]==1?0:dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}