iteration: brief solution using additional memory:
classSolution {publicintuniquePathsWithObstacles(int[][] obstacleGrid) {int n = obstacleGrid[0].length;int[] rowMemo =newint[n]; rowMemo[0]=1;for (int[] row : obstacleGrid){for(int i =0; i< n; i++){// it also resovle the i==0 case:// path from [0][0] to [x][0] is either 1 or 0// once path is 0, the next one [x+1][0] is always 0if (row[i] ==1) rowMemo[i]=0;elseif (i>0) rowMemo[i]+=rowMemo[i-1]; } }return rowMemo[n-1]; }}
recursion: not recommended, as the original values of the grid need to be revised;
classSolution {publicintuniquePathsWithObstacles(int[][] obstacleGrid) {int m =obstacleGrid.length;int n = obstacleGrid[0].length;for(int i=0; i<m; i++){for (int j=0;j<n; j++){//if obstacle, the value is -1;//if not visited, the value is -2; obstacleGrid[i][j] -=2; } }returnrecursion(m-1, n-1, obstacleGrid); }privateintrecursion(int m,int n,int[][] grid){if (grid[m][n]>=0) return grid[m][n]; if (grid[m][n]==-1) return0;if (m ==0&& n ==0){if (grid[m][n] ==-2) grid[m][n]=1;return grid[m][n]; }elseif (m ==0){ grid[m][n] =recursion(m, n-1, grid);return grid[m][n]; }elseif (n ==0){ grid[m][n] =recursion(m-1, n, grid);return grid[m][n]; } grid[m][n] =recursion(m-1, n, grid)+recursion(m, n-1, grid);return grid[m][n]; }}