每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles

2020年7月6日 不同路径 II uniquePathsWithObstacles

每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第1张图片
默认格式:

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {

    }
}

解题思路:

感觉这道题可以使用动态规划来做,我们从一个点的角度上来看,如果他同时能够向右和向下移动,那么道路的选择就多了一条。如果只有一个可以选择,那么道路数不变,如果下和右都是障碍,那么表示当前位置没有道路可以选择。

图解:

动态规划的最主要的思想就是,情况i+1的结果可以有情况i的结果推出。在这道题中也是:

我们先判断右下角同时作为起点和中的情况下,道路数是1。
每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第2张图片

然后我们放大这个区域。右下角的这一个点判断能够到达自己的所有的点有几条。可以看成一个2X1和一个1X2的矩形,我们可以得到两个新的点到达右下角的道路数,0和1.
每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第3张图片

每一个节点都是他下面和右边两个位置上值的和。
每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第4张图片

根据这个规则,我们可以遍历数组,得到左上角的值。
每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第5张图片

下图也能验证该算法的正确性

每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第6张图片
代码实现:

一遍通过,100%完美
每日一题算法:2020年7月6日 不同路径 II uniquePathsWithObstacles_第7张图片

    public int uniquePathsWithObstacles(int[][] obstacleGrid) {

        int len1=obstacleGrid.length;
        int len2=obstacleGrid[0].length;

        if (obstacleGrid[len1-1][len2-1]==1){
            return 0;
        }

        for(int i=len1-1;i>=0;i--){
            for (int j=len2-1;j>=0;j--){
                if (obstacleGrid[i][j]==1)
                    obstacleGrid[i][j]=0;
                else
                //如果当前节点的右边和下边都存在,值等于两者加在一起
                if (i+1<len1&&j+1<len2){
                        obstacleGrid[i][j]=obstacleGrid[i+1][j]+obstacleGrid[i][j+1];
                }
                //如果只有下面那个存在
                else if (i+1<len1){
                        obstacleGrid[i][j]=obstacleGrid[i+1][j];
                }
                else if (j+1<len2){
                        obstacleGrid[i][j]=obstacleGrid[i][j+1];
                }else {
                    obstacleGrid[i][j]=1;
                }
            }
        }
        return obstacleGrid[0][0];
    }

你可能感兴趣的:(每日一题算法)