63.不同路径
记录自己的算法:
问题1:
- 规则:每次只能向下或者向右。
- 问题:机器人从左上角到右下角有多少种走法。
public int uniquePaths(int m, int n) {
if(n == 0 || m == 0) return 0;
int[][] dp = new int[n][m];
dp[0][0] = 1;
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(i == 0 || j ==0){ //最上边和最左边的每一个元素,都只有一种走法
dp[i][j] = 1;
}else { //如果不是最左 /上边,那么它的走法就是左和上的走法的和
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[n-1][m-1];
}
问题2:
- 规则:每次只能向下或者向右,途中不能通过障碍物。
- 问题:机器人从左上角到右下角有多少种走法。
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// 判断数组是否为空数组
if(obstacleGrid == null || obstacleGrid.length == 0 || (obstacleGrid.length ==1 && obstacleGrid[0].length ==0) ) {
return 0;
}
int row = obstacleGrid.length;
int col = obstacleGrid[0].length;
// 判断数组的左上角(即出发点)是否为障碍物,如果是,则直接返回0;
if(obstacleGrid[0][0] ==1)
return 0;
// 遍历数组,动态规划求解
int[][] dp = new int[row][col];
for(int i = 0;i<row;i++){
for(int j = 0;j<col;j++){
next(dp,obstacleGrid,i,j);
}
}
return dp[row-1][col-1];
}
public static void next(int[][] dp,int[][] obstacleGrid,int i,int j){
if(i == 0){ //如果是第一行,判断二维数组的当前值是否为障碍物
if(obstacleGrid[i][j] == 1){ //假如是障碍物,则令它的走法为0
dp[i][j] = 0;
}else{ //假如不是障碍物,接着判断是当前坐标是否为左上角的值(即出发位置)
if(j == 0){ //如果是出发位置,它的走法为1
dp[i][j] = 1;
}else{ //如果不是出发位置,走法就是它左边一个坐标的走法
dp[i][j] = dp[i][j-1];
}
}
}else if(j == 0){ //如果是第一列,判断二维数组的当前值是否为障碍物
if(obstacleGrid[i][j] == 1){ //假如是障碍物,则令它的走法为0
dp[i][j] = 0;
}else{
if(i == 0){ //假如不是障碍物,接着判断是当前坐标是否为左上角的值(即出发位置)
dp[i][j] = 1; //如果是出发位置,它的走法为1
}else{
dp[i][j] = dp[i-1][j]; //如果不是出发位置,走法就是它上边一个坐标的走法
}
}
}else{ //如果不是第一行或者第一列,接着判断是否为障碍物
if(obstacleGrid[i][j] == 1){ //如果是障碍物,那么它的走法就是0
dp[i][j] = 0;
}else{ // 如果不是障碍物,让他的走法就是它的左边和上边的走法的和
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
}