不同路径Ⅱ(中等)
2020年7月6日
题目来源:力扣
解题
因为只能向右走和向下走,那么最后的坐标只能由上面的坐标或者左边的坐标移动得到,由此推出状态转移方程
- DP
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int finX=obstacleGrid.length,finY=obstacleGrid[0].length;
int[][] dp=new int[finX+1][finY+1];
//判断第一个和最后一个坐标不为1,再继续运算
if(obstacleGrid[0][0]==1 && obstacleGrid[finX-1][finY-1]==1) return 0;
//先给dp的第一行和第一列赋值,没有障碍物代表能走这条路就设为1
for(int i=0;i<finX;i++){
if(obstacleGrid[i][0]==1)
break;
dp[i][0]=1;
}
for(int i=0;i<finY;i++){
if(obstacleGrid[0][i]==1)
break;
dp[0][i]=1;
}
//每个点只能由左边的坐标和上边的坐标移动到
for(int i=1;i<finX;i++){
for(int j=1;j<finY;j++){
dp[i][j]=obstacleGrid[i][j]==1 ? 0:dp[i-1][j]+dp[i][j-1];
}
}
return dp[finX-1][finY-1];
}
}
用DFS超时了,目前不知道如何改进时间
class Solution {
private int count=0;
private int[][] dxy={{1,0},{0,1}};
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int finX=obstacleGrid.length;
int finY=obstacleGrid[0].length;
if(obstacleGrid[0][0]==1 && obstacleGrid[finX-1][finY-1]==1) return 0;
dfs(0,0,finX,finY,obstacleGrid);
return count;
}
public void dfs(int x,int y,int finX,int finY,int[][] obstacleGrid){
if(x==finX-1 && y==finY-1){
count++;
return ;
}
for(int i=0;i<2;i++){
int curX=x+dxy[i][0];
int curY=y+dxy[i][1];
if(curX>=0 && curX<finX && curY>=0 && curY<finY){
if(obstacleGrid[curX][curY]==0){
dfs(curX,curY,finX,finY,obstacleGrid);
}
}
}
return ;
}
}