不同路径2
解题思路:动态规划+自底向上+去除障碍
class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int xlen = obstacleGrid.length; int ylen = obstacleGrid[0].length; int min = Math.min(xlen,ylen); int max = Math.max(xlen,ylen); int[][] flags = new int[2][min]; boolean minflags = false; boolean maxflags = false; int cur = 0; int sum = 0; if(min==xlen){ for(int i=0;i<xlen+ylen-1;++i){ sum = 0; for(int j=0;j<min;++j){ if(i-j>=0&&i-j<max){ if(obstacleGrid[j][i-j]==1){ flags[cur][j] = 0; if(j==0&&!minflags){ minflags = true; } if(i-j==0&&!maxflags){ maxflags = true; } }else{ if(j==0||i-j==0){ if(j==0&&!minflags||i-j==0&&!maxflags){ flags[cur][j] = 1; }else{ flags[cur][j] = 0; } }else{ flags[cur][j] = flags[1-cur][j-1] + flags[1-cur][j]; } } sum += flags[cur][j]; } } if(sum==0){ return 0; } cur = 1 - cur; } }else{ for(int i=0;i<xlen+ylen-1;++i){ sum = 0; for(int j=0;j<min;++j){ if(i-j>=0&&i-j<max){ if(obstacleGrid[i-j][j]==1){ flags[cur][j] = 0; if(j==0&&!maxflags){ maxflags = true; } if(i-j==0&&!minflags){ minflags = true; } }else{ if(j==0||i-j==0){ if(j==0&&!maxflags||i-j==0&&!minflags){ flags[cur][j] = 1; }else{ flags[cur][j] = 0; } }else{ flags[cur][j] = flags[1-cur][j-1] + flags[1-cur][j]; } } sum += flags[cur][j]; } } if(sum==0){ return 0; } cur = 1 - cur; } } return flags[1-cur][min-1]; } }