【Leetcode刷题】--动态规划--Leetcode63-求网格中的唯一路径数 二

题干:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

说明:m 和 的值均不超过 100。

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

解题:思路和62题差不多,考虑边界情况,也就是obstacleGrid[0][i]  、obstacleGrid[j][0]  时路径的问题。如果障碍物在第一行或者第一列的情况,如果障碍物在第一行,那么第一行中障碍物之后的列的路径个数都是0,如果障碍物在第一列的话也是一样的道理。

边界情况如下处理,先创建一个二维数组,用来存放结果。:

   vector ret(cols,0);
    vector> result(rows,ret);
    for(int i=0;i         result[i][0]=1;
    for(int j=0;j         result[0][j]=1;

int uniquePathsWithObstacles(vector>&obstacleGrid){
	int rows=obstacleGrid.size();
	if(rows==0)
		return 0;
	int cols=obstacleGrid[0].size();
	if(cols==0)
		return 0;
	if(obstacleGrid[0][0]==1||obstacleGrid[rows-1][cols-1]==1)
		return 0;

	vector ret(cols,0);
	vector> dp(rows,ret);
	for(int i=0;i

也可以使用输入数组存放结果:

int uniquePathsWithObstacles(vector>& obstacleGrid) {
    int rows = obstacleGrid.size();
    if(rows == 0) return 0;
    int cols = obstacleGrid[0].size();
    if(cols == 0) return 0;
    if(obstacleGrid[0][0]) return 0;
    
    // first cell has 1 path
    obstacleGrid[0][0] = 1;
    
    // first row all are '1' until obstacle (from left only)
    for(int i=1; i

 

你可能感兴趣的:(#,Leetcode刷题)