classSolution{ int ans = 0; publicintuniquePathsWithObstacles(int[][] obstacleGrid){ dfs(obstacleGrid, 0, 0); return ans; } publicvoiddfs(int[][] ob, int i, int j){ if (i >= ob.length || j >= ob[0].length) return; if (ob[i][j] == 1) return; if (i == ob.length - 1 && j == ob[0].length - 1) ans++; dfs(ob, i + 1, j); dfs(ob, i, j + 1); } }
classSolution{ int[][] dp; publicintuniquePathsWithObstacles(int[][] obstacleGrid){ int m = obstacleGrid.length; int n = obstacleGrid[0].length; dp = newint[m][n]; return dfs_dp(obstacleGrid, 0, 0);
} publicintdfs_dp(int[][] ob, int i, int j){ if (i == ob.length || j == ob[0].length) return0; if (ob[i][j] == 1) return0; if (i == ob.length - 1 && j == ob[0].length - 1) return1; if (dp[i][j] != 0) return dp[i][j]; dp[i][j] += dfs_dp(ob, i + 1, j) + dfs_dp(ob, i, j + 1); return dp[i][j]; } }
classSolution publicintuniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; int[][] dp = newint[m+1][n+1];
for (int i = m-1;i>=0;i--){ for (int j = n-1;j>=0;j--){ if (i==m-1&&j==n-1&&obstacleGrid[i][j]==0) dp[i][j] = 1; elseif (obstacleGrid[i][j]==0){ dp[i][j] = dp[i+1][j] + dp[i][j+1]; } } } return dp[0][0]; }