28
07/2015
[LeetCode] Unique Paths II
Unique Paths II
Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1
and 0
respectively in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]
The total number of unique paths is 2
.
Note: m and n will be at most 100.
解题思路:
这道题的题意是从左上角到右下角走,一次只能走一步,且方向只能向下或向右。1是障碍物,不能行走。一共有多少种走法。
方法1:回溯法。代码如下。但是会产生超时问题。
class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int m = obstacleGrid.size(); if(m<=0){ return 0; } int n = obstacleGrid[0].size(); if(n<=0){ return 0; } if(obstacleGrid[0][0]==1 || obstacleGrid[m-1][n-1]==1){ return 0; } int result = 0; helper(obstacleGrid, 0, 0, m, n, result); return result; } void helper(vector<vector<int>>& obstacleGrid, int i, int j, int m, int n, int& result){ if(obstacleGrid[i][j]==1){ return; } if(i==m-1&&j==n-1){ result++; return; } if(i<m-1){ helper(obstacleGrid, i+1, j, m, n, result); } if(j<n-1){ helper(obstacleGrid, i, j+1, m, n, result); } } };
方法2:动态规划法。设d[i][j]表示从0,0到i,j共有多少条路径。则有:
d[i][j]=0, 当matrix[i][j]=1;
d[i][j]=d[i-1][j] + d[i][j-1]; 其他。
注意边界条件的限制。
代码如下:
class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int m = obstacleGrid.size(); if(m<=0){ return 0; } int n = obstacleGrid[0].size(); if(n<=0){ return 0; } if(obstacleGrid[0][0]==1 || obstacleGrid[m-1][n-1]==1){ return 0; } vector<vector<int>> d(m, vector<int>(n, 0)); d[0][0] = 1; for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ if(obstacleGrid[i][j]==1){ d[i][j]=0; }else{ if(i>0){ d[i][j] += d[i-1][j]; } if(j>0){ d[i][j] += d[i][j-1]; } } } } return d[m-1][n-1]; } };
转载请注明:康瑞部落 » [LeetCode] Unique Paths II
0 条评论