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

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

在这里插入图片描述
默认格式:

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

    }
}

解题思路:

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

图解:

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

我们先判断右下角同时作为起点和中的情况下,道路数是1。
在这里插入图片描述

然后我们放大这个区域。右下角的这一个点判断能够到达自己的所有的点有几条。可以看成一个2X1和一个1X2的矩形,我们可以得到两个新的点到达右下角的道路数,0和1.
在这里插入图片描述

每一个节点都是他下面和右边两个位置上值的和。
在这里插入图片描述

根据这个规则,我们可以遍历数组,得到左上角的值。
在这里插入图片描述

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

在这里插入图片描述
代码实现:

一遍通过,100%完美
在这里插入图片描述

    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];
    }
©️2020 CSDN 皮肤主题: 游动-白 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值