LeetCode 63. Unique Paths II

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.

[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]

The total number of unique paths is 2.

Note: m and n will be at most 100.

解题思路:这题在上一题上多了一点限制,思路和上一题相似,主要是由正上方的路径和正左方的路径和来得到当前路径数量,由于多了障碍,所以要对障碍的位置进行判断。如果障碍是在第一行或者第一列,则障碍之前是可以走通的,障碍之后是没有路径可走的。而对于除去第一行和第一列的位置,先要对该处的障碍进行判断,如果当前位置有障碍,表示走不通,dp[i][j]=0; 否则,dp[i][j]仍然等于dp[i-1][j]+dp[i][j-1]。
public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        if(obstacleGrid.length >0 ){
            if(obstacleGrid[0].length>0){
                int row = obstacleGrid.length; //row 行长度
                int col = obstacleGrid[0].length;  //col 列长度
                int [][] dp = new int [row][col];

                if(obstacleGrid[0][0]==1 || obstacleGrid[row-1][col-1]==1){
                    return 0;
                }else{
                    for(int i=0;i<row;i++){
                        for(int j=0;j<col;j++){
                            dp[i][j]=0; 
                        }
                    }
                    for(int i=0;i<col;i++){ //对第一行进行计算
                        if(obstacleGrid[0][i]==0){
                            dp[0][i]=1;
                        }else{
                            break;  //后面的保留dp初值0
                        }
                    }
                    for(int i=0;i<row;i++){ //对第一列进行计算
                        if(obstacleGrid[i][0]==0){
                            dp[i][0]=1;
                        }else{
                            break;  //后面的保留dp初值0
                        }
                    }
                    for(int i=1;i<row;i++){
                        for(int j=1;j<col;j++){
                            if(obstacleGrid[i][j]==0){  //如果该处没有障碍
                                dp[i][j]=dp[i][j-1]+dp[i-1][j];
                            }else{
                                dp[i][j]=0; //如果该处有障碍
                            }
                        }
                    }
                    return dp[row-1][col-1];
                }
            }
        }
        return 0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值