博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
63. Unique Paths II
阅读量:6464 次
发布时间:2019-06-23

本文共 4642 字,大约阅读时间需要 15 分钟。

题目:

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.

 

Hide Tags
   
 

链接:  

题解:

也是DP问题,Unique Path一样可以in place解决。要点是在设置第一行和第一列碰到obstacle的时候,要将其以及之后的所有值设置为零,因为没有路径可以达到。之后在DP扫描矩阵的时候,也要讲obstacle所在的位置清零。

Time Complexity - O(m * n), Space Complexity - O(1)。

public class Solution {    public int uniquePathsWithObstacles(int[][] obstacleGrid) {        int rowNum = obstacleGrid.length, colNum = obstacleGrid[0].length;        if(obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0][0] == 1){            return 0;        }                for(int row = 0; row < rowNum; row ++){            if(obstacleGrid[row][0] == 0)                obstacleGrid[row][0] = 1;            else if (obstacleGrid[row][0] == 1){              //if find obstacle, set all [row,0] below obstacle to 0                for(int tempRow = row; tempRow < rowNum; tempRow ++)                    obstacleGrid[tempRow][0] = 0;                break;            }        }                 for(int col = 1; col < colNum; col ++){            if(obstacleGrid[0][col] == 0)                obstacleGrid[0][col] = 1;            else if (obstacleGrid[0][col] == 1){            // //if find obstacle, set all [0,col] one the right of obstacle to 0                for(int tempCol = col; tempCol < colNum; tempCol ++)                    obstacleGrid[0][tempCol] = 0;                break;            }        }                for(int i = 1; i < rowNum; i ++){            for(int j = 1; j < colNum; j ++){                if(obstacleGrid[i][j] == 1)                    obstacleGrid[i][j] = 0;                else                    obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];            }        }                return obstacleGrid[rowNum - 1][colNum - 1];    }}

 

二刷:

和一刷一样, 就是先判断行和列中的obstacle元素,将其与其之后的为止置零。接下来遍历整个矩阵。

Java:

Time Complexity - O(m * n), Space Complexity - O(1)。

public class Solution {    public int uniquePathsWithObstacles(int[][] obstacleGrid) {        if (obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0][0] == 1) {            return 0;        }        int rowNum = obstacleGrid.length, colNum = obstacleGrid[0].length;        for (int i = 0; i < rowNum; i++) {            if (obstacleGrid[i][0] == 1) {                for (int k = i; k < rowNum; k++) {                    obstacleGrid[k][0] = 0;                }                break;            } else {                obstacleGrid[i][0] = 1;            }        }            for (int j = 1; j < colNum; j++) {            if (obstacleGrid[0][j] == 1) {                for (int k = j; k < colNum; k++) {                    obstacleGrid[0][k] = 0;                }                break;            } else {                obstacleGrid[0][j] = 1;            }        }            for (int i = 1; i < rowNum; i++) {            for (int j = 1; j < colNum; j++) {                if (obstacleGrid[i][j] == 1) {                    obstacleGrid[i][j] = 0;                } else {                    obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];                }            }        }        return obstacleGrid[rowNum - 1][colNum - 1];    }}

 

三刷:

Java:

public class Solution {    public int uniquePathsWithObstacles(int[][] obstacleGrid) {        if (obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0][0] == 1) {            return 0;        }        int rowNum = obstacleGrid.length, colNum = obstacleGrid[0].length;        for (int i = 0; i < rowNum; i++) {            if (obstacleGrid[i][0] == 1) {                for (int k = i; k < rowNum; k++) {                    obstacleGrid[k][0] = 0;                }                break;            } else {                obstacleGrid[i][0] = 1;            }        }            for (int j = 1; j < colNum; j++) {            if (obstacleGrid[0][j] == 1) {                for (int k = j; k < colNum; k++) {                    obstacleGrid[0][k] = 0;                }                break;            } else {                obstacleGrid[0][j] = 1;            }        }            for (int i = 1; i < rowNum; i++) {            for (int j = 1; j < colNum; j++) {                obstacleGrid[i][j] = obstacleGrid[i][j] == 1 ? 0 : obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];            }        }        return obstacleGrid[rowNum - 1][colNum - 1];    }}

 

转载地址:http://hrhzo.baihongyu.com/

你可能感兴趣的文章
AngularJS中文社区第一个学习应用实例-phonecat正确教程
查看>>
Springboot使用JPA操作数据库
查看>>
Yii2 RESTful API 的详细使用
查看>>
App上线小结
查看>>
为何 ES Module 如此姗姗来迟
查看>>
对RPC的理解
查看>>
一次发现underscore源码bug的经历以及对学术界拿来主义的思考
查看>>
vue实践:vue-router跳转
查看>>
Intellij IDEA快捷键整理(Mac版本)
查看>>
为你的博客添加访问量统计
查看>>
【读书笔记】JVM垃圾收集与内存分配策略
查看>>
CSS技巧记录
查看>>
快速理解JavaScript中this的用法与陷阱
查看>>
[Leetcode] The Skyline Problem 天际线问题
查看>>
vue - 教程 - 入门
查看>>
通过类型继承深入理解原型继承
查看>>
纯css无缝滚动
查看>>
memset()一般是对字符型数组赋初值,如果非要对整型数组赋初值,只能赋值0....
查看>>
无法为 php_mysqli 指定 mysqli.default_socket 参数
查看>>
Facebook开发AI语音助手,或是“钱途”未卜
查看>>