不同路径||(leetcode)
题目: 物体怎样从左上角移动到右下角,其中1表示有障碍,不能行走。
思路:
-
知道整个方框的行和列。
-
对第一行和第一列进行填充1,当碰到1(障碍)填充0。
-
本题可以被视为一个动态规划的问题,从上到下,从左到右,其中到达一个终点的路径总是左边路径**+**上面路径。 即:
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i-1][j] + dp[i][j-1] dp[i][j]=dp[i−1][j]+dp[i][j−1]
代码:
class Solution{
public int uniquePathsWithObstacles(int[][] obstacleGrid){
int R = obstacleGrid.length;
int C = obstacleGrid[0].length;
//If the starting cell has an obstacle, then simply return as there would be
//no paths to the destination.
if(obstacleGrid[0][0] == 1){
return 0;
}
//Number of ways of reaching the starting cell = 1.
obstacleGrid[0][0] = 1;
//Filling the values for the first column
for(int i = 1;i < R; i++){
obstacleGrid[i][0] = (obstacleGrid[i][0] == 0 && obstacleGrid[i-1][0] == 1)?1:0;
}
//Filling the values for the first row
for(int i = 1; i<C;i++){
obstacleGrid[0][i]=(obstacleGrid[0][i] == 0 && obstalceGrid[0][i-1] == 1)?1 : 0;
}
//Starting from cell(1,1) fill up the values
//No. of ways of reaching cell[i][j] = cell[i-1][j] + cell[i][j-1]
//i.e. From above and left.
for(int i=1;i<R;i++){
for(int j=1;j<C;j++){
if(obstacleGrid[i][j] == 0){
obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstalceGrid[i][j-1];
}else{
obstacleGrid[i][j]=0;
}
}
}
return obstacleGrid[R-1][C-1];
}
}