欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 【从零开始的LeetCode-算法】63. 不同路径 II

【从零开始的LeetCode-算法】63. 不同路径 II

2025/2/10 11:05:12 来源:https://blog.csdn.net/qq_40878316/article/details/145519215  浏览:    关键词:【从零开始的LeetCode-算法】63. 不同路径 II

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 10 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2 * 109

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]01

我的解答:

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int y_end = obstacleGrid.length;int x_end = obstacleGrid[0].length;// 标记数组,需要比原数组长1,允许走到界外int[][] dps = new int[y_end + 1][x_end + 1];// 初始化数组元素为-1,标识是否走到过该位置for(int y = 0;y <= y_end; y++){for(int x = 0;x <= x_end; x++){dps[y][x] = -1;}}return dpsFun(dps,0,0,obstacleGrid);}/**dps:标识数组x:当前位置横坐标y:当前位置纵坐标obstacleGrid:原数组*/private int dpsFun(int[][] dps,int x,int y,int[][] obstacleGrid){// 元素不为-1,说明已经走过了,剪枝if(dps[y][x] != -1) return dps[y][x];// 如果当前位置为障碍物或界外,返回0并标记此路已走过if(y >= obstacleGrid.length || x >= obstacleGrid[0].length || obstacleGrid[y][x] == 1) return dps[y][x] = 0;// 如果当前位置为终点,则返回1并标记此路已走过if(x == obstacleGrid[0].length - 1 && y == obstacleGrid.length - 1) return dps[y][x] = 1;// 当前位置向右或向下走有几种可行方案return dps[y][x] = dpsFun(dps,x + 1,y,obstacleGrid) + dpsFun(dps,x,y + 1,obstacleGrid);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com