leetcode-cn Daily Challenge on July 6th, 2020.
Difficulty : Medium
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
Note: m and n will be at most 100.
Input: [ [0,0,0], [0,1,0], [0,0,0] ] Output: 2 Explanation: There is one obstacle in the middle of the 3x3 grid above. There are two ways to reach the bottom-right corner: 1. Right -> Right -> Down -> Down 2. Down -> Down -> Right -> Right
- mine
- Java
-
Dynamic Programming
Runtime: 1 ms, faster than 26.41%, Memory Usage: 39.1 MB, less than 30.22% of Java online submissions
// O(S)time O(S)space // S = r * c public int uniquePathsWithObstacles(int[][] obstacleGrid) { if(obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0].length == 0 || obstacleGrid[0][0] != 0){ return 0; } //dp[i][j] = dp[i-1][j] + dp[i][j-1]; int r = obstacleGrid.length; int c = obstacleGrid[0].length; int[][] dp = new int[r][c]; for(int i = 0; i < r; i++){ for(int j = 0; j < c; j++){ if(obstacleGrid[i][j] != 0){ continue; } if(i == 0 && j == 0){ dp[i][j] = 1; continue; } if(i == 0){ dp[i][j] = dp[i][j - 1]; }else if(j == 0){ dp[i][j] = dp[i - 1][j]; }else{ dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } } return dp[r - 1][c - 1]; }
-
- Java
- the most votes
Runtime: 0 ms, faster than 100.00%, Memory Usage: 39.5 MB, less than 14.52% of Java online submissions
// O(R*C)time O(C)space public int uniquePathsWithObstacles(int[][] obstacleGrid) { int width = obstacleGrid[0].length; int[] dp = new int[width]; dp[0] = 1; for (int[] row : obstacleGrid) { for (int j = 0; j < width; j++) { if (row[j] == 1) dp[j] = 0; else if (j > 0) //dp[j] is dp[i-1][j] dp[j] += dp[j - 1]; } } return dp[width - 1]; }
- the leetcode solution
-
Dynamic Programming
Runtime: 0 ms, faster than 100.00%, Memory Usage: 39.7 MB, less than 8.31% of Java online submissions
// O(R*C)time O(1)space public int uniquePathsWithObstacles(int[][] obstacleGrid) { int R = obstacleGrid.length; int C = obstacleGrid[0].length; // If the starting cell has an obstacle, then simply return as there would be // no paths to the destination. if (obstacleGrid[0][0] == 1) { return 0; } // Number of ways of reaching the starting cell = 1. obstacleGrid[0][0] = 1; // Filling the values for the first column for (int i = 1; i < R; i++) { obstacleGrid[i][0] = (obstacleGrid[i][0] == 0 && obstacleGrid[i - 1][0] == 1) ? 1 : 0; } // Filling the values for the first row for (int i = 1; i < C; i++) { obstacleGrid[0][i] = (obstacleGrid[0][i] == 0 && obstacleGrid[0][i - 1] == 1) ? 1 : 0; } // Starting from cell(1,1) fill up the values // No. of ways of reaching cell[i][j] = cell[i - 1][j] + cell[i][j - 1] // i.e. From above and left. for (int i = 1; i < R; i++) { for (int j = 1; j < C; j++) { if (obstacleGrid[i][j] == 0) { obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1]; } else { obstacleGrid[i][j] = 0; } } } // Return value stored in rightmost bottommost cell. That is the destination. return obstacleGrid[R - 1][C - 1]; }
-