首页 > 代码库 > 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.
dp解法,注意第一行或第一列有一个为1,则该行或该列后到达路径全为0.
public class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { if(obstacleGrid==null || obstacleGrid[0][0]==1) return 0; int m=obstacleGrid.length; int n=obstacleGrid[0].length; int [][]f=new int[m][n]; for(int i=0;i<n;i++){ if(obstacleGrid[0][i]==0) f[0][i]=1; else{ for(int k=i;k<n;k++) f[0][k]=0; break; } } for(int j=0;j<m;j++){ if(obstacleGrid[j][0]==0) f[j][0]=1; else{ for(int k=j;k<m;k++) f[k][0]=0; break; } } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ if(obstacleGrid[i][j]==1) f[i][j]=0; else{ f[i][j]=f[i-1][j]+f[i][j-1]; } } } return f[m-1][n-1]; } }滚动数组dp
public class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { if(obstacleGrid==null || obstacleGrid[0][0]==1) return 0; int m=obstacleGrid.length; int n=obstacleGrid[0].length; int []f=new int[n]; for(int i=0;i<n;i++){ if(obstacleGrid[0][i]==0) f[i]=1; else{ for(int k=i;k<n;k++) f[k]=0; break; } } for(int i=1;i<m;i++){ for(int j=0;j<n;j++){ if(j==0 ){ if(obstacleGrid[i][j]==1){ f[j]=0; } continue; } if(obstacleGrid[i][j]==1) f[j]=0; else{ f[j]=f[j]+f[j-1]; } } } return f[n-1]; } }dfs
public class Solution { public int [][]f; public int uniquePathsWithObstacles(int[][] obstacleGrid) { if(obstacleGrid==null || obstacleGrid[0][0]==1) return 0; int m=obstacleGrid.length; int n=obstacleGrid[0].length; f=new int[m+1][n+1]; return dfs(m,n,obstacleGrid); } public int dfs(int m,int n,int[][] obstacleGrid){ if(m<1 || n<1 || obstacleGrid[m-1][n-1]==1) return 0;// if(m==1 && n==1) return 1;//reach start point return record(m-1,n,obstacleGrid)+record(m,n-1,obstacleGrid);// } public int record(int x,int y,int[][] obstacleGrid){ if(f[x][y]>0) return f[x][y]; else return f[x][y]=dfs(x,y,obstacleGrid); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。