|
| 1 | +// https://leetcode.com/problems/unique-paths-ii |
| 2 | +// T: O(m * n) |
| 3 | +// S: O(n) |
| 4 | + |
| 5 | +public class UniquePathII { |
| 6 | + public int uniquePathsWithObstacles(int[][] obstacleGrid) { |
| 7 | + final int rows = obstacleGrid.length, columns = obstacleGrid[0].length; |
| 8 | + if (obstacleGrid[rows - 1][columns - 1] == 1) return 0; |
| 9 | + final int[][] memory = getMemoryTable(obstacleGrid); |
| 10 | + |
| 11 | + int i = 0; |
| 12 | + for (int row = rows - 2 ; row >= 0; row--, i ^= 1) { |
| 13 | + memory[i][columns - 1] = memory[i ^ 1][columns - 1] & (obstacleGrid[row][columns - 1] ^ 1); |
| 14 | + for (int column = columns - 2 ; column >= 0 ; column--) { |
| 15 | + if (obstacleGrid[row][column] == 1) { |
| 16 | + memory[i][column] = 0; |
| 17 | + } else { |
| 18 | + memory[i][column] = memory[i ^ 1][column] + memory[i][column + 1]; |
| 19 | + } |
| 20 | + } |
| 21 | + } |
| 22 | + |
| 23 | + return memory[i ^ 1][0]; |
| 24 | + } |
| 25 | + |
| 26 | + private int[][] getMemoryTable(int[][] obstacles) { |
| 27 | + final int rows = obstacles.length, columns = obstacles[0].length; |
| 28 | + final int[][] memory = new int[2][columns]; |
| 29 | + memory[1][columns - 1] = 1; |
| 30 | + for (int column = columns - 2 ; column >= 0 ; column--) { |
| 31 | + memory[1][column] = memory[1][column + 1] & (obstacles[rows - 1][column] ^ 1); |
| 32 | + } |
| 33 | + return memory; |
| 34 | + } |
| 35 | +} |
0 commit comments