bobo老师麻烦帮我看看力扣63题(不同路径II障碍物)

来源:9-3 发现重叠子问题 Integer Break

慕粉张张张

2021-08-17

  • 我还是想用递归+记忆数组的思路来写,有个特别长的测试用例过不去,bobo老师麻烦你帮我看一下思路有没有问题
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
    {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>>memo(m + 1 , vector<int>(n + 1 , - 1));
        int ret = uniquePathsWithObstacles(obstacleGrid,memo,m - 1 , n - 1);
        return ret;

    }
private:
    //需要向上走x步,向左走y步的路径总数
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid,vector<vector<int>>& memo,int x, int y) 
    {
        //递归到底的情况
        //x == 0向上走到头了往左看看y方向有没有障碍物
       if(x == 0)
       {
           for(int i = 0 ; i < obstacleGrid[0].size() ; i ++)
           {
               if(obstacleGrid[0][i] == 1)
                    return 0;
           }
           return 1;
       }
        //y == 0向左走到头了,找x(上)看看x方向有没有障碍
       if(y == 0)
       {
           for(int i = 0 ; i < obstacleGrid.size() ; i ++)
           {
               
               if(obstacleGrid[i][0] == 1)
                    return 0;
           }
           return 1;
       }


       if(memo[x][y] != -1)
            return memo[x][y];
       //当前位置就是障碍
       if(obstacleGrid[x][y] == 1)
       {
           memo[x][y] = 0;
           return 0;
       }
     
       int pathNums1 = uniquePathsWithObstacles(obstacleGrid,memo,x - 1,y);
       int pathNums2 = uniquePathsWithObstacles(obstacleGrid,memo,x,y - 1);
       memo[x][y] = pathNums1 + pathNums2 ;
       return memo[x][y];

    }
};

写回答

2回答

liuyubobobo

2021-08-17

递归走到头的时候,不应该看整个第 0 行或者第 0 列,而应该看第 0 行 y 以前或者第 0 列 x 以前:


if(x == 0){
    // 注意,是 i <= y
    for(int i = 0 ; i <= y ; i ++)
    {
        if(obstacleGrid[0][i] == 1)
            return 0;
    }
    return 1;
}
       
if(y == 0){
    // 注意,是 i <= x
    for(int i = 0 ; i <= x ; i ++)
    {
        if(obstacleGrid[i][0] == 1)
            return 0;
    }
    return 1;
}


继续加油!:)


1
1
慕粉张张张
非常感谢bobo老师,我刚刚查代码也正好发现这个错误了--||
2021-08-17
共1条回复

慕粉张张张

提问者

2021-08-17

经典自问自答,递归中止条件写错了!!!应该这样写!

//递归到底的情况

        //x == 0找y(左)看看y方向有没有障碍

       if(x == 0)

       {

            //i的初值应该从y开始,往前找有没有障碍物

           for(int i = y ; i >= 0 ; i --)

           {

               if(obstacleGrid[0][i] == 1)

                    return 0;

           }

           return 1;

       }


        //y == 0找x(上)看看x方向有没有障碍

       if(y == 0)

       {

        //i的初值应该从x开始,往前找有没有障碍物

           for(int i = x ; i >= 0 ; i --)

           {

               

               if(obstacleGrid[i][0] == 1)

               {

                   return 0;

               }

                    

           }

           return 1;

       }


0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程