标签:算法
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); } }
Unique Paths II,布布扣,bubuko.com
标签:算法
原文地址:http://blog.csdn.net/dutsoft/article/details/38638757