每日一题算法: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];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值